在控制台应用程序中使用async / await时,为什么需要AsyncContext?

时间:2015-03-03 19:22:36

标签: c# .net asynchronous async-await console-application

我在控制台应用程序中调用异步方法。我不希望应用程序在启动后不久就退出,即在等待完成任务之前。好像我可以这样做:

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());之后返回主线程,那么为什么我需要使用自定义上下文?

1 个答案:

答案 0 :(得分:23)

不需要;这只是我的偏好。

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

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

但在一天结束时,这只是一个偏好问题。