【问题标题】:.Net 4.0 Threadpool in Windows AzureWindows Azure 中的 .Net 4.0 线程池
【发布时间】:2011-04-04 13:18:23
【问题描述】:

我目前正在开发一个 Windows azure 项目,我们正在使用命令模式来封装我们的方法调用。现在我们正在尝试并行执行命令并控制创建的线程数。

首先想到:ThreadPool 好用,可以设置 MaxThreads。但据我所知,每个 Begin*(例如 BeginInvoke)方法都使用线程池,因此我们无法控制专用于我们命令的线程数。

今天一位同事在 MSDN 上发现了这个TaskScheduler,看起来比 ThreadPool 好,但我不知道它是否能正常工作。

除了线程池还有其他替代方案吗?使用 ThreadPool 和 Windows Azure 的经验?

【问题讨论】:

  • 我只想控制最大线程数,而不是运行时的线程数,如果你这么想的话。
  • 线程池在平衡未完成线程的数量方面做得非常好。你应该让它完成它的工作。 .NET 4.0 线程池在这方面做得更好。如果您的任务是长时间运行的任务,线程池可能不适合您(它比前一个做得更好);你会想要使用任务系统,或者自己创建和管理线程。

标签: c# multithreading azure azure-worker-roles


【解决方案1】:

您可以使用System.Threading.Parallel - 它具有允许您控制多线程程度的参数。

var threadOptions = new ParallelOptions { MaxDegreeOfParallelism = 5 };    
Parallel.For(0, 1000, threadOptions, i=>    
{    
    // do stuff...
});

到目前为止,我在 WorkerRoles 中使用它没有任何问题。但在 Web 角色中,这将是一个问题 - 因为 IIS 也使用相同的 ThreadPool 来处理 Web 请求。

值得一读 - http://msdn.microsoft.com/en-us/library/dd460693.aspx - 即将在 C#5 中推出的还有新的 Async 框架(目前在 CTP 中)

【讨论】:

    【解决方案2】:

    您正在运行 Fx 4,这意味着您可以使用 TPL 和 PLINQ。两者都在(改进的)线程池之上运行。

    所以您可以从在 TPL 上运行它开始,例如使用 Parallel.ForEach() 。底层 ThreadPool 已经尝试通过线程数来平衡工作负载。对于(很多)相当短的任务,这通常效果很好。

    下一步是将.WithDegreeOfParallelism(numCoresTouse) 添加到 TPL 或 PLINQ。

    在这里编写/使用自定义 (TPL) 调度程序似乎有些矫枉过正。

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2021-02-20
      • 2011-06-15
      • 1970-01-01
      相关资源
      最近更新 更多