1

現在、Windows Azureプロジェクトに取り組んでおり、コマンドパターンを使用してメソッド呼び出しをカプセル化しています。現在、コマンドを並行して実行し、作成されるスレッドの数を制御しようとしています。

最初の考え:ThreadPoolは使いやすく、MaxThreadsを設定できます。しかし、私が知る限り、すべてのBegin *(BeginInvokeなど)-メソッドはスレッドプールを使用するため、コマンド専用のスレッドの数を制御することはできません。

今日、同僚がMSDNでこのTaskSchedulerを見つけました。これは、ThreadPoolよりも見栄えが良いですが、正しく機能するかどうかはわかりません。

ThreadPoolに代わるものは他にありますか?ThreadPoolとWindowsAzureの経験はありますか?

4

2 に答える 2

3

使用できますSystem.Threading.Parallel-マルチスレッドの程度を制御できるパラメータがあります。

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

これまで、これをWorkerRolesで問題なく使用してきました。ただし、Webロールでは、これは問題になります。IISもThreadPoolWebリクエストの処理に同じものを使用するためです。

読む価値があります--http://msdn.microsoft.com/en-us/library/dd460693.aspx-そしてC#5で間もなく登場するのは、新しいAsyncフレームワーク(現在はCTP)です。

于 2011-04-04T13:26:44.110 に答える
3

Fx 4を実行しています。つまり、TPLとPLINQを使用できます。どちらも(改善された)ThreadPool上で実行されています。

したがって、TPLで実行することから始めることができます。たとえば、Parallel.ForEach()。基盤となるThreadPoolは、すでにワークロードとスレッド数のバランスをとろうとしています。(多くの)かなり短いタスクの場合、これは通常うまく機能します。

次のステップは .WithDegreeOfParallelism(numCoresTouse)、TPLまたはPLINQのいずれかに追加することです。

カスタム(TPL)スケジューラーの作成/使用は、ここではやり過ぎのようです。

于 2011-04-04T15:43:30.983 に答える