1. 程式人生 > 其它 >C# async&await+Task

C# async&await+Task

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();