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

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

最佳答案

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

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

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

但归根结底,这只是一个偏好问题。

关于c# - 为什么在控制台应用程序中使用 async/await 时需要 AsyncContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28840188/

相关文章:

c# - TPL .ContinueWith 在执行大量任务时优先

javascript - 在 Node js 中将异步函数转换为同步函数?

C# Visual Studio - 我正在尝试读取文本文件并将其显示到 Richtextbox 中并包含新行

java - 如何避免使用领域驱动设计拥有非常大的对象

c# - 在wpf后面创建控件异步代码

java - 以编程方式从第三方站点发送邮件

c# - 使用 Roslyn 引用 PCL 库会导致 .NET 版本问题

c# - 隐藏页面 url asp.net

c# - 我怎样才能获得对属性 setter 的引用?

c# - 在 LDAP 与凭据绑定(bind)时授权任何用户名为空的人