博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Async Console Programs 异步控制台程序
阅读量:5798 次
发布时间:2019-06-18

本文共 1084 字,大约阅读时间需要 3 分钟。

如果你正在写一个控制台程序,你可能最终想要一个异步的main方法,像这样:

class Program{  static async void Main(string[] args)  {    ...  }}

很不幸,那个没用(实际上,VS 11 编译器拒绝异步Main方法)。我的这篇博客《》里讲过,当异步方法完成后会返回到它的调用者。虽然这在UI应用(方法仅仅返回到UI事件循环)和ASP.NET(方法脱离线程返回但请求还是活着的【在生命周期内】)中运行很完美,但在控制台程序中不会工作得这么好:因为Main返回到操作系统,因此你的程序退出了。

你可以通过提供你自己的兼容异步上下文来变通一下。AsyncContext(异步上下文)是通用的上下文,它用来启用异步的MainAsync:

class Program{  static int Main(string[] args)  {    try    {      return AsyncContext.Run(() => MainAsync(args));    }    catch (Exception ex)    {      Console.Error.WriteLine(ex);      return -1;    }  }  static async Task
MainAsync(string[] args) { ... }}

以下为一个较为常见的问题,望园友们注意!

问:关于使用".Wait()"来等待一个来自非异步的Main方法的异步方法,推荐使用AsyncContext吗?

答:在Main方法中要么使用AsyncContext,要么使用GetAwaiter().GetResult()。GetAwaiter().GetResult()本质上和Wait()一样,但是它没有把异常封装在AggregateException中。

AsyncContext在主控制台线程中装配了一个真实的单线程上下文。GetAwaiter().GetResult()将自由上下文默认保留在控制台应用中。如果我在写一个概念证明型的代码,并且最终在ASP.NET或者UI应用(具有单线程上下文)中终止,我通常就会使用AsyncContext;如果我在写一个真实的控制台应用,我可以任选一种方式。

 

本文转自tkbSimplest博客园博客,原文链接:http://www.cnblogs.com/farb/p/4839847.html,如需转载请自行联系原作者

你可能感兴趣的文章
Leetcode PHP题解--D9 657. Robot Return to Origin
查看>>
SpringMVC验证框架Validation特殊用法
查看>>
DNS简介及配置
查看>>
Cocos2d-x android can't resolved coscos2dx library
查看>>
有限单元法(The Finite Element Method)
查看>>
为什么不能往Android的Application对象里存储数据
查看>>
JavaWeb应用配置文件安全解决方案
查看>>
printf 对 线程同步 的影响(未完成)
查看>>
初识MariaDB之4——Xtrabackup备份与还原
查看>>
kail源
查看>>
解决js代码中加入alert()就成功执行,不加就不对的问题!
查看>>
memcached搭建和使用要点
查看>>
***是怎样改变世界的!!
查看>>
解决ecshop缩略图以及产品页图模糊的方法
查看>>
看看DelayQueue源码
查看>>
深入研究Java虚拟机的类加载机制
查看>>
c:if
查看>>
FastDFS安装配置实使用
查看>>
如何成为一名程序员:我的道路
查看>>
MySQL root密码恢复
查看>>