上次写到使用UniTask来替换协程IEnumerator,后来想了下协程函数通常是无返回值的,也就是void,那我不需要返回值的时候是不是可以直接用void标记呢?答案是可以。

    private IEnumerator Test1()
    {
        yield return new WaitForSeconds(5);
        Debug.Log("IEnumerator WaitForSeconds 5");
    }
    public async void Test2()
    {
        await UniTask.WaitForSeconds(5);
        Debug.Log("UniTask WaitForSeconds 5");
    }

如图所示,在Test2()中使用async搭配void,即可实现Test1()中的等待效果

    private void Start()
    {
        //StartCoroutine(Test1());
        Test2();
        Debug.Log("after WaitForSeconds 5");
    }
    private IEnumerator Test1()
    {
        yield return new WaitForSeconds(5);
        Debug.Log("IEnumerator WaitForSeconds 5");
    }
    public async void Test2()
    {
        await UniTask.WaitForSeconds(5);
        Debug.Log("UniTask WaitForSeconds 5");
    }

那么在使用时,可以直接调用方法,不再依赖MonoBehaviour中的StartCoroutine接口,更加便捷。

值得注意的是,await必须搭配通过调用另一个异步方法返回的任务。

参考资料:

使用 Async 和 Await 的任务异步编程 (TAP) 模型 | Microsoft Learn