private async void Test1(){ Console.WriteLine("111"); await Task.Delay(3000); Console.WriteLine("222"); }
先打印111,等待3秒后打印222
private async void Test2() { Console.WriteLine($"111:{GetThreadId()}"); //await:等待task里面执行结束,不会卡住主线程 await Task.Run(async () => { await Task.Delay(3000); Console.WriteLine($"333:{GetThreadId()}"); }); Console.WriteLine($"222:{GetThreadId()}"); }
先打印111,在打印333,最后打印222;
private async void Test3() { Console.WriteLine($"111:{GetThreadId()}"); //await:等待task里面执行结束,不会卡住主线程 Task task = Task.Run(async () => { await Task.Delay(3000); Console.WriteLine($"333:{GetThreadId()}"); }); //等待task执行结束,不会卡住主线程, //ConfigureAwait:执行此方法的代码时,下面的代码用task里面的线程 去执行 await task.ConfigureAwait(false); Console.WriteLine($"222:{GetThreadId()}"); }
先打印111,在打印333,最后打印222; 打印333与222的线程相同
private async Task Test4() { Console.WriteLine($"111:{GetThreadId()}"); //await:等待task里面执行结束,不会卡住主线程 Task task = Task.Run(async () => { await Task.Delay(3000); Console.WriteLine($"333:{GetThreadId()}"); }); //会等待task执行结束 //await task; await task.ConfigureAwait(false); Console.WriteLine($"222:{GetThreadId()}"); }
使用异步时,task不是返回值
先打印111,在打印333,最后打印222打印333与222的线程相同
//用异步编程的时候,返回值类型就是Task泛型里面的类型 private async Task<string> Test5() { await Task.Delay(2000); Console.WriteLine($"222:{GetThreadId()}"); return "Hello"; }
异步编程时,返回值是task泛型里面的类型
private async Task<string> Test6() { Task<string> task = Task.Run(async () => { await Task.Delay(3000); return "Hello"; }); string result = await task; //等待task执行结束,并接收返回值 await Task.Delay(1000); return result; }
任务执行结束,接收返回值
//会造成死锁问题 private async Task Test7() { Console.WriteLine($"aaa:{GetThreadId()}"); Task task = Task.Run(async () => { await Task.Delay(3000); Console.WriteLine($"ccc:{GetThreadId()}"); }); await task; //await task.ConfigureAwait(false); //ConfigureAwait:传个false,解决当前死锁问题 Console.WriteLine($"bbb:{GetThreadId()}"); }
线程间互相等待会造成死锁问题