在控制台应用程序中使用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上下文非常相似。
但在一天结束时,这只是一个偏好问题。