4

如何修改以下代码并使其同时运行多个任务?

foreach (SyndicationItem item in CurrentFeed.Items)
{
    if (m_bDownloadInterrupted)
    break;

    await Task.Run( async () =>
    {
        // do some downloading and processing work here
        await DoSomethingAsync();
    }
}

我还需要中断并停止该过程。因为我的 DoSomethingAsync 方法读取标签(一个全局布尔值)来停止进程。

谢谢

4

2 回答 2

9

不,这不会同时运行它们 - 您正在等待每个完成,然后再开始下一个。

您可以将每次Task.Run调用的结果放入一个集合中,然后启动它们之后等待。Task.WhenAll

(很遗憾Parallel.ForEach没有返回Task您可以等待的结果。可能有一个对异步更友好的版本......)

于 2012-09-06T08:49:41.870 回答
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

于 2012-09-06T09:58:42.173 回答