C# async&await+Task
阿新 • • 發佈:2022-05-05
async&await
非同步方法,使用起來更方便;(untiy自帶的startcoroutine和invoke也方便,但必須繼承MonoBehaviour,使用回撥的方式實現非同步);
await會開啟新的執行緒;
async關鍵字的函式中必須有await關鍵字使用;
返回: void,Task,Task
可以有引數,引數不能帶out和ref;
有些平臺不支援多執行緒,比如webgl...;
//無返回值 private async void Function2Async() { await Task.Delay(1000); } //有返回值 private async Task<string> FunctionAsync() { var res = await Task.Run(() => { Debug.Log("aaa"); return "kkk"; }); return res; }
Task
Task在多執行緒程式使用;
Task線上程池上進行了優化,提供了更多好用的api;
//無法返回值,呼叫方式 var t1 = new Task(() => { Debug.Log("BB"); }); t1.Start(); Task.WaitAll(t1); var t2 = Task.Run(() => { Debug.Log("BB"); }); t2.Wait(); var t3 = Task.Factory.StartNew(() => { Debug.Log("BB"); }); Task.WaitAll(t3); //有返回值 Task<int> task = new Task<int>(() => { return 1; }); task.Start(); int result = task.Result; //5,6並行,4,7序列 var t4 = new Task(() => { Debug.Log("BB"); }); t4.Start(); var t5 = t4.ContinueWith(t => { Debug.Log("cc"); }); var t6 = t4.ContinueWith(t => { Debug.Log("dd"); }); Task.WaitAll(t5, t6); var t7 = Task.Factory.StartNew(() => { Debug.Log("ee"); }); t7.Wait(); //子任務TaskCreationOptions.AttachedToParent Task<string[]> t8 = new Task<string[]>(() =>{ var a = new Task<string>(() => { return "bbb"; }, TaskCreationOptions.AttachedToParent); a.Start(); var b = new Task<string>(() => { return"ccc"; }, TaskCreationOptions.AttachedToParent); b.Start(); return new string[] {a.Result, b.Result}; }); t8.ContinueWith(t => { Debug.Log(t.Result[0]+t.Result[1]); }); //取消任務CancellationTokenSource var cts = new CancellationTokenSource(); var t9 = new Task<int>(() => { return 1; }, cts.Token); cts.Cancel();