【问题标题】:Querying a task's Result property cause the thread pool to create a new thread查询任务的 Result 属性会导致线程池创建一个新线程
【发布时间】:2011-04-06 12:03:33
【问题描述】:

这里引用了 Jeffrey Richter 的“CLR via C#”一书:

** 当另一个任务完成时自动启动一个新任务**

...调用 Wait 或查询任务的 任务未完成时的结果属性 尚未完成运行将很可能 导致线程池创建一个新的 线程,这增加了资源使用率 并损害可扩展性。

为什么线程池需要新建线程?

【问题讨论】:

  • 就我个人而言,我希望Wait 是一个常见的操作——如果这涉及到一个额外的线程,我会感到惊讶。
  • @Marc Gravell 反射器说你是对的:'code' public TResult get_Result() { if (!base.IsCompleted) { Debugger.NotifyOfCrossThreadDependency(); base.Wait(); } base.ThrowIfExceptional(!this.m_resultWasSet);返回 this.m_result; } '代码'
  • 我也在读那本书,昨天我也在读同样的部分……但我放弃了,因为我很困,我以为我没有读懂它。现在我知道我不是唯一一个哈哈

标签: c# .net multithreading


【解决方案1】:

在本机代码中,您将首先使用CreateThreadpoolWork 创建一个工作项,然后使用WaitForThreadpoolWorkCallbacks 函数等待它。

在 .NET 世界中,我会改用 TPL,创建一个任务,然后是 continuation task。将它与 TPL TaskScheduler 结合起来应该会给你想要的效果。

【讨论】:

    猜你喜欢
    • 2014-09-02
    • 1970-01-01
    • 2012-09-03
    • 2020-01-06
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    相关资源
    最近更新 更多