私はBlockingCollection
のパフォーマンスをベンチマークしています。 main()
方法でTask.Run()によって作成されたスレッド数をカウントしてください
class Program
{
private static BlockingCollection<int> bc = new BlockingCollection<int>(100000);
private static BlockingCollection<int> bc2 = new BlockingCollection<int>(100000);
static void Main(string[] args)
{
for (int i = 0; i < 100000; i++)
{
bc.TryAdd(i);
}
var stopWatch = new Stopwatch();
stopWatch.Start();
while (bc.Count != 0)
{
bc.Take();
}
stopWatch.Stop();
Console.WriteLine("Simple " + stopWatch.Elapsed.TotalMilliseconds);
createThreadPool(bc2);
Console.Read();
}
static void ByTaskRun(BlockingCollection<int> blockingCollection)
{
for (int i = 0; i < 100000; i++)
{
blockingCollection.TryAdd(i);
}
var stopWatch = new Stopwatch();
stopWatch.Start();
Task k = Task.Run(() =>
{
while (blockingCollection.Count != 0)
{
blockingCollection.Take();
}
});
stopWatch.Stop();
Console.WriteLine("Task.run " + stopWatch.Elapsed.TotalMilliseconds);
}
}
ByTaskRun()
に私は要素を取り出すタスクを実行している間、私は単純に、ブロッキングコレクションから要素を取ります。私はTask.Run()
がより速いことを発見しました。内部でThreadpool
を作成していますか? Task.Run
によって作成されたスレッドの数を取得したい場合は、その番号を取得するにはどうすればよいですか?
.net ThreadPoolのサイズを見てください。これは、コンソールアプリケーションでデフォルトで作業がスケジュールされる場所です。 BlockingCollectionは、キューイングの場合、貧しい人のBufferBlockです。 TPL DataFlowを見て、ThreadPool(または何もない)での作業を調整する適切な非同期の方法を見てください。 – spender
Process.Threadsをチェックすることもできます。 https://msdn.microsoft.com/en-us/library/system.diagnostics.process.threads(v=vs.110).aspx – Michael
作成するには、私の100000レコードを削除する4つのスレッドブロックコレクション? – Sameer