我正在控制台应用程序中调用异步方法。我不希望该应用在启动后即在等待的任务完成之前立即退出。看来我可以这样做:

internal static void Main(string[] args)
{
    try
    {
        Task.WaitAll(DoThisAsync());
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine(ex);
        throw;
    }
}

internal static async Task DoThisAsync()
{
    //...
}

但是根据Stephen Cleary's article看来,我无法做到这一点,而应该为异步创建某种上下文以使其在完成后返回(例如AsyncContext)。

上面的代码可以正常工作,并且在Task.WaitAll(DoThisAsync());之后返回主线程,那么为什么需要使用自定义上下文呢?

最佳答案

不是必需的这只是我的偏爱。

您可以同步阻止Main中的任务(使用Wait / Result / WaitAll)。语义略有不同;特别是,如果异步代码失败,那么Wait / Result / WaitAll会将异常包装在AggregateException中,而AsyncContext不会。

另外,AsyncContext专门对待主线程;而不是将继续发送到线程池,而是将继续发送回该主线程(默认情况下;您始终可以使用ConfigureAwait(false)避免这种情况)。如果我正在编写“概念验证”控制台应用程序,则这会很有用,因为AsyncContext的行为与UI上下文非常相似。

但归根结底,这只是一个偏好问题。

关于c# - 在控制台应用程序中使用async/await时,为什么需要AsyncContext?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28840188/

10-10 11:40