我在控制台应用程序中调用异步方法。我不希望应用程序在启动后不久即退出,即在可等待的任务完成之前退出。看来我可以这样做:
internal static void Main(string[] args)
{
try
{
Task.WaitAll(DoThisAsync());
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
throw;
}
}
internal static async Task DoThisAsync()
{
//...
}
但根据斯蒂芬·克利里的文章 http://blog.stephencleary.com/2012/02/async-console-programs.html看来我不能这样做,而应该为异步创建某种上下文,以便在完成时返回(例如异步上下文 https://github.com/StephenCleary/AsyncEx/wiki/AsyncContext).
上面的代码虽然有效,但它会在主线程上返回Task.WaitAll(DoThisAsync());
,那么为什么我需要使用自定义上下文呢?
这不是必需的;这只是我的偏好。
您可以同步阻止其中的任务Main
(using Wait
/Result
/WaitAll
)。语义略有不同;特别是,如果异步代码失败,那么Wait
/Result
/WaitAll
会将异常包装在AggregateException
, while AsyncContext
才不是。
Also, AsyncContext
对主线程进行特殊处理;它不会将延续发送到线程池,而是将它们发送回主线程(默认情况下;您始终可以使用ConfigureAwait(false)
以避免这种情况)。如果我正在编写“概念验证”控制台应用程序,我发现这很有用,因为AsyncContext
行为与 UI 上下文非常相似。
但归根结底,这只是一个偏好问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)