You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中await完成后,异步方法恢复执行需调用方满足什么条件?

异步方法await恢复执行的条件探究

当调用包含await操作的异步方法时,在await完成后,调用方法需满足什么条件才能让该异步方法恢复执行?例如在Unity环境中测试以下代码时,程序似乎永远无法结束(数分钟后我强制终止了它)。看起来只要Test方法卡在循环中,DoAsync方法就无法恢复执行。我推测需要满足某种条件才能恢复执行,但不确定具体是什么条件。注:我知道这段代码无实际用途,也不是异步的正确用法,这只是用于探究底层原理的实验。

class TestClass {

    bool finished = false;      
    int bb = 0; // 补充原代码遗漏的未定义变量

    void Test()
    {
        DoAsync();
        while (!finished) {
            for (int j = 0; j < 100000; j++) {
                bb++;
            }
        }
    }

    async void DoAsync() {
        await Task.Delay(1);
        finished = true;
    }
}

核心原因与恢复条件

  • 关键限制:同步上下文的占用
    在Unity这类单线程同步上下文的环境中,异步方法在await完成后,默认会尝试回到**原来的同步上下文(主线程)**执行后续代码(也就是finished = true这行)。但你的Test方法通过死循环完全霸占了主线程的执行时间,导致主线程根本没有机会去处理异步回调队列里的任务——Unity的消息循环(负责调度异步回调、生命周期函数等)被彻底卡死,DoAsync中await之后的代码永远得不到执行时机,finished变量也就永远不会被设为true,循环自然无法终止。

  • 恢复执行的必要条件
    调用方法不能持续占用异步方法要恢复执行的目标线程(或同步上下文),必须让该线程有空闲时间处理异步回调队列。在Unity里,意味着主线程不能被死循环阻塞,必须让消息循环正常运转(比如让Unity的Update等生命周期函数能正常执行),这样异步回调才能被调度到主线程上执行,异步方法才能完成后续逻辑。

内容的提问来源于stack exchange,提问作者Tomer B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:01:08