【问题标题】:C# How to get multiple tasks to start and then await themC#如何让多个任务开始然后等待它们
【发布时间】:2016-02-17 10:13:59
【问题描述】:

我正在努力让我的任务运行。我相信他们不会开始并且等待永远不会返回,这样我的应用程序就永远不会运行得更远。它旨在处理多个数据集(在执行时已知),因此我使用循环添加它们,它看起来是这样的:

foreach(IGrouping<enumType, Item> group in lp)
{
    Task<ProcessedItem> t = new Task<ProcessedItem>(
        () => ProcessItems(group.ToList(), group.Key));
    tasks.Add(t);
}

await Task.WhenAll(tasks);

(...)

它在 Task.WhenAll 处停止。我认为他们根本没有开始,我在另一个方法中有类似的代码,但是我直接将函数传递给任务:

Task<ReturnType>(Func);

我认为这是造成差异的原因,但由于参数的原因,我不能在此处以这种方式传递它。我应该如何修改我的代码以使其工作?我应该明确启动每项任务吗?如果任务在等待之前完成,那不会破坏等待关键字吗?

【问题讨论】:

    标签: c# asynchronous async-await task-parallel-library


    【解决方案1】:

    对于开始你需要调用Start()方法。并且你使用这个片段的方法必须用async关键字分配

    foreach(IGrouping<enumType, Item> group in lp)
    {
        Task<ProcessedItem> t = new Task<ProcessedItem>(() => ProcessItems(group.ToList(), group.Key));
    
        t.Start();
        tasks.Add(t);
    }
    
    await Task.WhenAll(tasks);
    
    (...)
    

    它将等待内部的所有任务然后tasks完成它们的执行

    或者你可以用Start()方法代替Task.Run()方法

    foreach(IGrouping<enumType, Item> group in lp)
    {
        Task<ProcessedItem> t = Task.Run(() => ProcessItems(group.ToList(), group.Key));
    
        tasks.Add(t);
    }
    
    await Task.WhenAll(tasks);
    
    (...)
    

    【讨论】:

      【解决方案2】:

      我认为他们根本没有开始

      你肯定是正确的。 new Task() 返回一个“冷任务”,这是一个尚未开始让您明确调用 Task.Start() 的任务。 The docs spell this out clearly:

      而不是调用这个构造函数,最常见的方法是 实例化一个 Task 对象并启动一个任务是通过调用静态 Task.Run(Action)TaskFactory.StartNew(Action) 方法。唯一的 这个构造函数提供的优点是它允许对象 实例化与任务调用分离。

      这是您不应该使用 Task 构造函数的原因之一,而是使用工厂方法,它为您提供了一个“热任务”,即已经开始。在这里,Task.Run 比较合适:

      var tasks = lp.Select(group => Task.Run(() => ProcessItems(group.ToList(), group.Key)));
      await Task.WhenAll(tasks);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-15
        • 2016-03-16
        • 2016-05-01
        • 1970-01-01
        • 2012-03-18
        • 2019-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多