여기에 TaskFactory
에 대한 확장 방법을 만드는 것이 좋습니다.
public static class TaskFactoryExtension
{
public static Task StartNew(this TaskFactory target, Action action, int parallelism)
{
var tasks = new Task[parallelism];
for (int i = 0; i < parallelism; i++)
{
tasks[i] = target.StartNew(action);
}
return target.StartNew(() => Task.WaitAll(tasks));
}
}
그러면 호출 코드는 다음과 같이 보입니다.
ConcurrentQueue<T> queue = GetQueue();
int n = GetDegreeOfParallelism();
var task = Task.Factory.StartNew(
() =>
{
T item;
while (queue.TryDequeue(out item))
{
ProcessItem(item);
}
}, n);
task.Wait(); // Optionally wait for everything to finish.
Parallel.ForEach
을 사용한 또 다른 아이디어입니다. 이 접근법의 문제점은 병렬 처리 수준이 반드시 존중되지 않을 수도 있다는 것입니다. 귀하는 절대 금액이 아니라 허용되는 최대 금액만을 표시합니다.
ConcurrentQueue<T> queue = GetQueue();
int n = GetDegreeOfParallelism();
Parallel.ForEach(queue, new ParallelOptions { MaxDegreeOfParallelism = n },
(item) =>
{
ProcessItem(item);
});
BlockingCollection은 큐의 목적을 무효화합니다. 반복되는 동안 블로킹 컬렉션에서 항목을 제거 할 수 없습니다. –
그 대신 [GetConsumingEnumerable] (http://msdn.microsoft.com/en-us/library/dd287186.aspx)을 사용할 수 있습니다. 'foreach (Item item in _collection.GetConsumingEnumerable())'도 컬렉션이 비어있는 경우 항목 추가를 기다리고 차단합니다. –