BlaXuan 发表于 2021-4-19 13:07

Unity 中的 async-await 咋用

async-await 是啥?


之前在Unity写一个定时功能,可以使用协程实现:
IEnumerator Start(){    Debug.Log("等待 1 秒");    yield return new WaitForSeconds(1.0f);    Debug.Log("结束");}
现在会有一种新的实现方式:就是 async-await
async void Start(){    Debug.Log("等待 1 秒");    await Task.Delay(TimeSpan.FromSeconds(1f));    Debug.Log("结束");}
那么这种语法究竟是什么呢?
自从C#5.0,语法糖大家庭又加入了两位新成员: async和await,也就是异步编程语法糖

有什么好处呢?
之前是怎么编程的呢?都是通过给异步请求传递一个回调函数,回调函数再对相应的处理
这样做的问题就是:发起请求的时候对返回值一无所知,十分别扭
但是现在 async-await 让异步请求成为了线性流程

举个例子:
如果想读取SteamingAssets下面的文件,之前都是用 协程+UnityWebRequest
现在可以用
    void Start()    {      ReadText();    }    async void ReadText()    {      Task<string> task = AsyncLoadText("test.txt");      await task;      Debug.Log(task.Result);    }    async Task<string> AsyncLoadText(string url)    {      string path = Path.Combine(Application.streamingAssetsPath, url);      UnityWebRequest getRequest = UnityWebRequest.Get(path);      await getRequest.SendWebRequest();      string text = getRequest.downloadHandler.text;      return text;    }
注意:await getRequest.SendWebRequest(); 这句话。
await 后面需要接的类型是 TaskAwaiter(INotifyCompletion),U3D最开始还没有这个语法,所以很多需要我们自己写扩展类,强行转成 TaskAwaiter 类型,让它支持这个语法。
public static class AsyncOperationExtensions{    public static TaskAwaiter GetAwaiter(this AsyncOperation asyncOperation)    {      var tcs = new TaskCompletionSource<object>();      asyncOperation.completed += obj => { tcs.SetResult(null); };      return ((Task)tcs.Task).GetAwaiter();    }}
有一个开源的项目:Unity3dAsyncAwaitUtil/releases

这里面封装了很多原来协程支持的类型,基本上可以做到无缝切换
大体模块如下:


image


大家可以自行查看,后续会根据这个,写一个新模式的定时器模块 ~~
页: [1]
查看完整版本: Unity 中的 async-await 咋用