如何启动并等待 Task 运行

Posted cinlap

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何启动并等待 Task 运行相关的知识,希望对你有一定的参考价值。

Task.Run + Task.WhenAll

Task.Run 里边可以搭配 async,所有由 Task.Run 启动起来的 Task 所组成的数组允许被 WhenAll 等待,调用线程(如UI线程)不会阻塞

List<Task> taskArray = new List<Task>(3);

taskArray.Add(Task.Run(async() =>
{
    for (var i = 0; i < 3; i++)
    {
        Console.WriteLine("tom saying" + i.ToString());
        await Task.Delay(1500);
    }
}));
taskArray.Add(Task.Run(async() =>
{
    for (var i = 0; i < 3; i++)
    {
        Console.WriteLine("Ant saying" + i.ToString());
        await Task.Delay(1500);
    }
}));
taskArray.Add(Task.Run(async() =>
{
    for (var i = 0; i < 3; i++)
    {
        Console.WriteLine("Tour saying" + i.ToString());
        await Task.Delay(1500);
    }
}));

Task done = Task.WhenAll(taskArray.ToArray());
await done.ContinueWith((t) => { Console.WriteLine($"{t.Status}"); });
Console.WriteLine("All work done");

如果 done 换做 Wait() 来等待的话,就会阻塞调用线程,如果是 UI 线程运行 Wait() 的话界面将冻结

Task done = Task.WhenAll(taskArray.ToArray());
done.Wait();
Console.WriteLine("All work done");

Task.Factory.StartNew + Task.WaitAll();

如果用 StartNew() 的方法创建并启动 Task,想要获得等待效果方法不能有 async 修饰

List<Task> taskArray = new List<Task>(3);

taskArray.Add(Task.Factory.StartNew(() =>
{
    for (var i = 0; i < 30; i++)
    {
        Console.WriteLine("tom saying" + i.ToString());
        Task.Delay(1500);
    }
}));
taskArray.Add(Task.Factory.StartNew(() =>
{
    for (var i = 0; i < 30; i++)
    {
        Console.WriteLine("Ant saying" + i.ToString());
        Task.Delay(1500);
    }
}));
taskArray.Add(Task.Factory.StartNew(() =>
{
    for (var i = 0; i < 30; i++)
    {
        Console.WriteLine("Tour saying" + i.ToString());
        Task.Delay(1500);
    }
}));

Task.WaitAll(taskArray.ToArray());
Console.WriteLine("All work done");

注意 Task.Delay() 没有 await 的修饰,如果加入 await/async 的组合运行后 WaitAll() 将失效,这是为什么呢?不太懂。

以上是关于如何启动并等待 Task 运行的主要内容,如果未能解决你的问题,请参考以下文章

合并 Observable 列表并等待所有完成

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?

线程 task pritce

在ViewPager上,在onPageSelected上的片段上启动动画

多线程--Task,等待用户输入AutoResetEvent

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题