一尘不染

并行执行任务

c#

好的,所以基本上我有很多任务(10),我想同时启动所有任务并等待它们完成。完成后,我想执行其他任务。我读了很多有关此的资源,但我无法针对我的具体情况…

这是我目前拥有的(代码已简化):

public async Task RunTasks()
{
    var tasks = new List<Task>
    {
        new Task(async () => await DoWork()),
        //and so on with the other 9 similar tasks
    }


    Parallel.ForEach(tasks, task =>
    {
        task.Start();
    });

    Task.WhenAll(tasks).ContinueWith(done =>
    {
        //Run the other tasks
    });
}

//This function perform some I/O operations
public async Task DoWork()
{
    var results = await GetDataFromDatabaseAsync();
    foreach (var result in results)
    {
        await ReadFromNetwork(result.Url);
    }
}

所以我的问题是,当我等待WhenAll呼叫完成任务时,它告诉我所有任务都结束了,即使它们都没有完成。我尝试添加Console.WriteLine自己foreach,当我进入继续任务时,数据一直从我之前Task尚未完成的s中输入。

我在这里做错了什么?


阅读 170

收藏
2020-05-19

共1个答案

一尘不染

您几乎永远都不要Task直接使用构造函数。在您的情况下,该任务只会触发您迫不及待的实际任务。

您只需调用DoWork并取回任务,将其存储在列表中,然后等待所有任务完成即可。含义:

tasks.Add(DoWork());
// ...
await Task.WhenAll(tasks);

但是,异步方法将同步运行,直到第一次等待未完成的任务。如果您担心该部分花费的时间太长,请使用Task.Run将其卸载到另一个ThreadPool线程,然后
将该 任务存储在列表中:

tasks.Add(Task.Run(() => DoWork()));
// ...
await Task.WhenAll(tasks);
2020-05-19