码迷,mamicode.com
首页 > 其他好文 > 详细

如何启动并等待 Task 运行

时间:2020-02-21 17:47:49      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:string   冻结   创建   await   work   wait   code   就会   允许   

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 运行

标签:string   冻结   创建   await   work   wait   code   就会   允许   

原文地址:https://www.cnblogs.com/cinlap/p/12342217.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!