【发布时间】:2014-05-04 01:02:22
【问题描述】:
我的代码中有类似的东西:
Parallel.ForEach(myList, new ParallelOptions { MaxDegreeOfParallelism = 4 }, item =>
{
Process(item);
});
问题是我在Process() 方法中做了很多事情(连接到文件共享、解析文件、保存到数据库等),我担心在此过程中可能会出现问题,从而使迭代永远不会完成...这会发生吗?
有没有办法为Process() 方法设置超时以避免最终出现僵尸线程?
更新:
我发现设置超时的最简单方法是向CancellationTokenSource 添加毫秒数或在任务上调用Wait() 方法。
选项#1
Parallel.ForEach(myList, new ParallelOptions { MaxDegreeOfParallelism = 4 }, item =>
{
var cts = new CancellationTokenSource(2000);
Task task = Task.Factory.StartNew(() => Process(item), cts.Token);
});
选项#2
Parallel.ForEach(myList, new ParallelOptions { MaxDegreeOfParallelism = 4 }, item =>
{
Task task = Task.Factory.StartNew(() => Process(item));
task.Wait(2000);
});
问题是这些选项都不能取消Process() 方法。我需要检查Process() 方法中的某些内容吗?
【问题讨论】:
-
“这会发生吗?”绝对...如果您有一个永远不会完成的进程(等待永远不会发生的 IO、无限循环等...),那么循环将永远不会完成。
-
所以我需要找到一种方法来避免无休止的迭代......也许通过用 Threading.Timer 包围 Process 方法调用?
-
您是坚持使用 .NET 4,还是可以迁移到 .NET 4.5?如果可以,那么您有更好的选择。
-
我正在使用 .NET 4.5 ...任何想法都值得赞赏!
-
只是想知道为什么要在 Parallel.ForEach 中创建任务?我认为 Parallel.ForEach 已经为您做到了...
标签: c# task-parallel-library c#-5.0 parallel.foreach