我想从不同的线程调用耗时工作的方法。
Public void DoSomeWork(int n)
{
// Time Consuming operation depending on n.
}
1 - 我正在尝试使用task而不是thread&线程池。
2 - 应该有最多n个并行运行的线程
3 - 当我尝试使用'SemaphoreSlim'时,我发现它多次调用相同的线程调用方法并遇到无法处理的异常。
实施:
for (int i = 0; i < SomeNumberList.Count; i++)
{
semaphore.Wait();
Task.Factory.StartNew(() => DoSomeWork(SomeNumberList[i])).ContinueWith(x => semaphore.Release());
}
如何使用任务通过并发线程使用任务调用DoSomeWork以及如何对其进行错误处理?
答案 0 :(得分:1)
Parallel.For已经为您提供了进行此类任务的必要编组。
const int n = 5; // No more than "n threads"
Parallel.For(0, SomeNumberList.Count, new ParallelOptions{MaxDegreeOfParallelism = n}, i =>
{
DoSomeWork(i);
}
如果您需要根据并发执行中发生的事情处理异常或中断调用,还有另一个重载可以为您提供ParallelLoopState。