InjectFix icon indicating copy to clipboard operation
InjectFix copied to clipboard

为何不能直接使用await Task.Delay呢

Open AskrYggdrasillsCR opened this issue 2 years ago • 2 comments

public class TestPatch : MonoBehaviour
{
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            CallOneAsync("hello");
        }
    }

    [Patch]
    public async void CallOneAsync(string name)
    {
        Debug.Log(name);
        await Task.Delay(1000);
        Debug.Log("TestTask");
    }
}

这样子写是不会等待一秒之后执行Debug.Log("TestTask"); 但是像下面这样操作的话就可以正常执行

public class TestPatch : MonoBehaviour
{
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            CallOneAsync("hello");
        }
    }

    [Patch]
    public async void CallOneAsync(string name)
    {
        Debug.Log(name);
        await TestTask();
    }

    private async Task TestTask()
    {
        await Task.Delay(1000);
        Debug.Log("TestTask");
    }
}

AskrYggdrasillsCR avatar Jul 06 '23 08:07 AskrYggdrasillsCR

我遇到了同样得问题,一旦遇到await,代码执行顺序就会错乱

lishengru avatar Jul 19 '23 09:07 lishengru

不用Task,用UniTask.Delay()试试? await Task.Delay 默认是ConfigureAwait(true), 也就是等await完成后继续从调用时的上下文继续执行. 放在[Patch]里的方法是 自己实现的虚拟机的代码,不确定会不会有问题. UniTask应该强制就用UniTask的调度过程中执行了吧

tomLan7 avatar Feb 12 '25 03:02 tomLan7