BlockingCollection
의 성능을 벤치마킹하고 있습니다. ByTaskRun()
에 내가 요소를 꺼내 작업을 실행하는 동안 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);
}
}
, 나는 단순히 차단 컬렉션에서 요소를 가지고. 나는
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
4 개의 스레드로 내 100,000 개의 레코드를 제거한다고 가정 해 봅시다. 컬렉션을 차단 하시겠습니까? – Sameer