0

タスク ファクトリに次のようなタスクを入力しています (疑似コード):

private int _taskcounter;

をちょきちょきと切る

var factory = new TaskFactory();
for(var i = 0;i<1000;i++)
   factory.StartNew(() => doWork());

をちょきちょきと切る

private void doWork(){
   Interlocked.Increment(ref _taskcounter);
   //do some slow I/O work here
   Interlocked.Decrement(ref _taskcounter);
}

_taskcounter を見ると、
最初は約 10 個のタスクが開始されていることがわかりますが、キューが終了するまで 1 ~ 2 個のタスク/秒が開始されます。

ささいな明白な行動ですね。

私の質問は:
タスク ファクトリに強制的に開始時にさらに多くのタスクを開始させる方法はありますか?

過度のメモリ消費を防ぐために、いくつかのmsdnサンプルクラスのバリエーションを使用して、実行中のタスクの最大数を既に制限しています。
それとも、このおかしな測定方法や私の考察が間違っているのでしょうか?

すべての作業を異なるスレッドで実行する必要はありません。それ以外の場合は、ファクトリを使用し
ません。ファクトリの非ワーク スティーリング動作の恩恵を受けるだけです。

他のすべてについては、工場の知性に頼っています。

4

1 に答える 1

1

私が知っているように、TaskFactory は ThreadPool を使用するので、SetMaxThreadsメソッドを試すことができます。しかし実際には、リソースの消費を最適化するように設計されています。したがって、効率が大幅に向上するとは思いません。

また、 を使用してスレッドを手動で開始することもできますnew Thread()。これにより、多くのスレッドをすぐに開始することができますが、効率が大幅に向上するとは思えません。

于 2013-12-09T10:54:05.653 に答える