小编典典

在 C# 的控制台应用程序中使用“异步”

all

我有这个简单的代码:

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())。

static void Main(string[] args)
{
     SumTwoOperationsAsync();
}

但我已经读过(使用时 )*sync我必须一直上下 同步*

这是否意味着我的Main功能应标记为async

嗯, 不可能 是因为有编译错误:

入口点不能用“异步”修饰符标记

如果我理解异步的东西,线程将进入Main函数SumTwoOperationsAsync-
将调用这两个函数并退出。但直到SumTwoOperationsAsync

我错过了什么?


阅读 63

收藏
2022-06-30

共1个答案

小编典典

在大多数项目类型中,您的async“向上”和“向下”将在async void事件处理程序处结束或将 a 返回Task到您的框架。

但是,控制台应用程序不支持此功能。

您可以只Wait对返回的任务执行 a:

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控制台应用程序的更多信息在我的博客上

2022-06-30