【发布时间】:2015-05-04 14:22:47
【问题描述】:
我正在控制台应用程序中调用异步方法。我不希望应用程序在启动后不久退出,即在等待任务完成之前。看来我可以这样做:
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());之后返回主线程,那为什么我需要使用自定义上下文?
【问题讨论】:
-
当你使用线程池时可能会发生这种情况。线程池线程是后台线程,只有主线程是前台。 UI 应用程序将有一个主循环,不允许它们在某些事情发生之前退出,而控制台应用程序通常没有这个循环。所以,如果你不阻塞你的主线程等待某些东西,你的应用程序将简单地退出,你在线程池上所做的工作将会消失。不过我不确定。
-
正如@StephenCleary 提到的,这只是一种偏好。你如何阻塞线程并不重要,你只需要注意,如果你不以某种方式管理该线程,你的应用程序将退出(即使你的其他线程没有完成)
-
@Brandon 好吧,这很重要。它们的功能不同,但当然可以使用任何一种方法编写工作程序。
标签: c# .net asynchronous async-await console-application