【问题标题】:how to run multiple tasks in C#?如何在 C# 中运行多个任务?
【发布时间】:2012-09-06 08:47:43
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: c# parallel-processing task


    【解决方案1】:

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

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

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

    【讨论】:

    • 对不起,我在那个任务里面等待。忘记把它放进去。那我怎么能解决这个问题呢?谢谢。
    • @Jon: Parallel.ForEach 使用调用线程作为其并行线程之一,因此您可以通过将其包装在 Task.Run 中使其异步友好。
    • @Jerry: Task.Run 将按预期与异步 lambda 和同步 lambda 一起工作(它解开异步的)。所以你仍然可以将结果放入一个集合中,然后等待Task.WhenAll
    • @StephenCleary:好点子 - 感觉有点恶心,但比手动收集任务要好得多。
    【解决方案2】:

    这将同时处理这些项目。

      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

    【讨论】:

    • 对不起,请问如何根据您提供的方法中断和停止进程?因为我的 DoSomethingAsync 方法读取标签以停止该过程。谢谢!
    猜你喜欢
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2022-06-16
    • 2015-10-20
    相关资源
    最近更新 更多