public static async Task TestTask()
{
Console.WriteLine("主线程开始");
Stopwatch st1=new Stopwatch();
st1.Start();
List<Task> tasks = new List<Task>();
for (int i = 0; i < 10; i++)
{
tasks.Add(TestAsync(i,"一"));
}

await Task.WhenAll(tasks);
st1.Stop();
Console.WriteLine($"异步一{st1.ElapsedMilliseconds}");
Console.WriteLine("List<Task>执行结束");
Stopwatch st2 = new Stopwatch();
st2.Start();
for (int i = 0; i < 10; i++)
{
await TestAsync(i,"二");
}
st2.Stop();
Console.WriteLine($"异步二{st2.ElapsedMilliseconds}");
Console.WriteLine("异步二执行结束");
Stopwatch st3 = new Stopwatch();
st3.Start();
for (int i = 0; i < 10; i++)
{
Test(i);
}
st3.Stop();
Console.WriteLine($"同步{st3.ElapsedMilliseconds}");
Console.WriteLine("同步执行结束");
Console.WriteLine("主线程结束");
}
public static void Test(int i)
{
Thread.Sleep(1000);
Console.WriteLine($"异步线程执行同步{i}");
}
public static async Task TestAsync(int i,string name)
{
await Task.Run(() =>
{
Thread.Sleep(1000);
Console.WriteLine($"异步线程执行异步{name}{i}");

});
}

如上代码,最近在使用多线程编程,对async和await很疑惑,就自己写了个例子去验证下。

 

 控制台输出显示,虽然是异步编程,但是用了await关键字后,程序会等待调用的方法执行完成后,再进行下一段逻辑。花费的时间甚至比同步编程还多。

但是用List<Task>配合Task.WhenAll后,时间缩短了5倍。所以,如果碰到b逻辑需要等待a逻辑全部执行完,但是又希望用多线程,可以采用task.whenall。

Posted on 2020-07-30 16:06  渣呀喂  阅读(494)  评论(0)    收藏  举报