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

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

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的文章 ,似乎我不能这样做,而应该创建某种上下文,让async在完成后返回(例如AsyncContext )。

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

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

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

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

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