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

时间:2014-04-27 09:42:45

标签: c# asynchronous mono async-await

我有以下代码示例:

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");
        }
    }
}

启动此程序时,我希望输出只是“同步”,因为asynctest方法永远不会在我的代码中继续。

相反,它输出“同步”和“异步”。

现在我的问题是程序从run方法切换到asynctest方法以打印“Async”行。根据我以前使用协同程序的经验,这不应该发生。

1 个答案:

答案 0 :(得分:1)

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

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

如果你从UI线程调用它,你会遇到死锁,因为await将尝试在UI线程上执行asynctest方法的剩余部分,而后者又在{{{ 1}}循环。

查看this article,它解释了有关while(true)async最佳做法的更多信息。