我有这个简单的代码:
public static async Task<int> SumTwoOperationsAsync() { var firstTask = GetOperationOneAsync(); var secondTask = GetOperationTwoAsync(); return await firstTask + await secondTask; } private async Task<int> GetOperationOneAsync() { await Task.Delay(500); // Just to simulate an operation taking time return 10; } private async Task<int> GetOperationTwoAsync() { await Task.Delay(100); // Just to simulate an operation taking time return 5; }
大。这样编译。
但可以说我有一个控制台应用程序,我想运行上面的代码(调用SumTwoOperationsAsync())
SumTwoOperationsAsync()
static void Main(string[] args) { SumTwoOperationsAsync(); }
但我读过,(使用时sync)我对所有同步的方式 向上 和 向下 :
sync
问题 :这是否意味着我的Main功能应标记为async?
Main
async
嗯, 不可能 是因为存在编译错误:
入口点不能用’async’修饰符标记
如果我理解异步的东西,线程将进入Main函数----> SumTwoOperationsAsync-—>将调用这两个函数,并且将退出。但直到SumTwoOperationsAsync
SumTwoOperationsAsync
我想念什么?
在大多数项目类型中,async“向上”和“向下”将在async void事件处理程序处结束或将a返回Task到框架。
async void
Task
但是,控制台应用程序不支持此功能。
您可以只Wait对返回的任务执行:
Wait
static void Main() { MainAsync().Wait(); // or, if you want to avoid exceptions being wrapped into AggregateException: // MainAsync().GetAwaiter().GetResult(); } static async Task MainAsync() { ... }
或者您也可以像我写的那样使用自己的上下文:
static void Main() { AsyncContext.Run(() => MainAsync()); } static async Task MainAsync() { ... }
有关async控制台应用程序的更多信息,请访问我的博客。