c#中的异步方法:连续点

本文关键字:连续 异步方法 | 更新日期: 2023-09-27 18:00:26

我有以下代码示例:

using System;
using System.Threading;
using System.Threading.Tasks;
namespace asynctest {
    class Program {
        public static void Main (string[] args) {
            var program = new Program ();
            program.run ();
        }
        public Program () {
        }
        public void run () {
            asynctest ();
            Console.WriteLine ("Sync");
            while (true) {
            }
        }
        public async Task asynctest () {
            await Task.Delay (100);
            Console.WriteLine ("Async");
        }
    }
}

当启动这个程序时,我希望输出只是"Sync",因为异步测试方法在我的代码中永远不会继续。

相反,它同时输出"同步"answers"异步"。

我现在的问题是,程序究竟在哪里从run方法切换到asynctest方法来打印"Async"行。从我以前的合作经历来看,这种情况不应该发生。

c#中的异步方法:连续点

默认情况下,从Console程序启动的任务在线程池上运行,因此程序开始在线程A上运行。您的asynctest方法被调用,一旦遇到await Task.Delay (100);,它就会返回,然后继续写入Sync字符串。然后线程A阻塞while循环。

编译器用asynctest方法构建了一个状态机,在Task.Delay(100)完成后,它将在线程池线程B上恢复执行并打印Async。然后线程B终止。线程A仍然卡在while循环上。

如果从UI线程调用此方法,则会出现死锁,因为await将尝试在UI线程上执行asynctest方法的其余部分,而该方法又在while(true)循环中被阻止。

看看这篇文章,它对asyncawait的最佳实践进行了更多的解释。