1

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

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

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

ThreadPool 还有其他替代方案吗?使用 ThreadPool 和 Windows Azure 的经验?

4

2 回答 2

3

您可以使用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 中推出的也是新的异步框架(目前在 CTP 中)

于 2011-04-04T13:26:44.110 回答
3

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

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

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

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

于 2011-04-04T15:43:30.983 回答