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()}"); }
非同期使用時はタスクが戻り値になりません
最初に 111 を印刷し、次に 333 を印刷し、最後に 222 を印刷します。333 と 222 を印刷するスレッドは同じです。
//用异步编程的时候,返回值类型就是Task泛型里面的类型 private async Task<string> Test5() { await Task.Delay(2000); Console.WriteLine($"222:{GetThreadId()}"); return "Hello"; }
非同期プログラミングの場合、戻り値はタスク ジェネリックの型になります。
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()}"); }
スレッドが互いに待機していると、デッドロックの問題が発生する可能性があります