我有这个简单的代码:
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
嗯, 不可能 是因为有编译错误:
入口点不能用“异步”修饰符标记
如果我理解异步的东西,线程将进入Main函数SumTwoOperationsAsync- 将调用这两个函数并退出。但直到SumTwoOperationsAsync
SumTwoOperationsAsync
我错过了什么?
在大多数项目类型中,您的async“向上”和“向下”将在async void事件处理程序处结束或将 a 返回Task到您的框架。
async void
Task
但是,控制台应用程序不支持此功能。
您可以只Wait对返回的任务执行 a:
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控制台应用程序的更多信息在我的博客上。