在C#中的控制台应用程序异步?

Roy*_*mir 168 c# async-await c#-5.0 .net-4.5

我有这个简单的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

大.这个编译.

但是让我们说我有一个控制台应用程序,我想运行上面的代码(调用SumTwoOperationsAsync())

 static  void Main(string[] args)
        {
             SumTwoOperationsAsync();
        }
Run Code Online (Sandbox Code Playgroud)

但我读过,(使用时sync),我不得不一路同步向上向下 :

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

不可能是因为存在编译错误:

无法使用"async"修饰符标记入口点

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

我错过了什么?

Ste*_*ary 284

在大多数项目类型中,async"up"和"down"将以async void事件处理程序结束或返回Task到框架.

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

你可以Wait在返回的任务上做一个:

static void Main()
{
  MainAsync().Wait();
  // or, if you want to avoid exceptions being wrapped into AggregateException:
  //  MainAsync().GetAwaiter().GetResult();
}

static async Task MainAsync()
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

或者您可以像我写的那样使用您自己的上下文:

static void Main()
{
  AsyncContext.Run(() => MainAsync());
}

static async Task MainAsync()
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息async控制台应用程序是在我的博客.

  • 我有一个[我的博客上的简介](http://blog.stephencleary.com/2012/02/async-and-await.html),它解释了线程如何通过"上下文"与`async`一起工作. (2认同)

Mur*_*rti 91

这是最简单的方法

static void Main(string[] args)
{
    Task t = MainAsync(args);
    t.Wait();
}

static async Task MainAsync(string[] args)
{
    await ...
}
Run Code Online (Sandbox Code Playgroud)