如何修改以下代码并使其同时运行多个任务?
foreach (SyndicationItem item in CurrentFeed.Items)
{
if (m_bDownloadInterrupted)
break;
await Task.Run( async () =>
{
// do some downloading and processing work here
await DoSomethingAsync();
}
}
我还需要中断并尽可能地停止这个过程。因为我的DoSomethingAsync方法读取标记(一个全局布尔值)来停止进程。
由于
答案 0 :(得分:9)
不,这不会同时运行它们 - 你在等待等待完成下一个之前完成它们。
您可以将每个Task.Run
调用的结果放入一个集合中,然后在启动它们之后等待Task.WhenAll
。
(遗憾的是Parallel.ForEach
没有返回你可以等待的Task
。可能有一个更加异步友好的版本......)
答案 1 :(得分:1)
这将同时处理这些项目。
Parallel.ForEach(CurrentFeed.Items, DoSomethingAsync)
为了取消你可能需要一个CancellationToken。
CancellationTokenSource cts = new CancellationTokenSource();
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
// Add the ParallelOptions with the token to the ForEach call
Parallel.ForEach(CurrentFeed.Items,po ,DoSomethingAsync)
// set cancel on the token somewhere in the workers to make the loop stop
cts.Cancel();
有关详细信息,请参阅(以及其他来源)http://msdn.microsoft.com/en-us/library/ee256691.aspx