使用async运行多个方法

Con*_*eak 2 c# asp.net asp.net-mvc asynchronous

让我说我有这个代码:

public async void Init(){
    init1();
    init2();
    init3();     
}
Run Code Online (Sandbox Code Playgroud)

第一个问题是它们是否异步运行?方法本身public void不是async.

第二个问题是我如何确保它们正在运行async并知道它们何时完成?像这样..

public async void Init(){
    init1();
    init2();
    init3();     
    await ... all finished
}
Run Code Online (Sandbox Code Playgroud)

第三,当我Init()在别处打电话时,它是不是可以用async方法包裹?喜欢下面这段代码,或者它必须是async吗?

public async void Init(){
    init1();
    init2();
    init3();   
}

public void doIt(){
  Init();
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 6

我有一个应该有所帮助的async介绍.

第一个问题是它们是否异步运行?

不,你真的不需要在Stack Overflow上问这个,因为编译器本身会给你一个警告,明确说明你的方法将同步运行.

第二个问题是我如何确保它们运行异步并知道它们何时完成?

首先,您的方法需要正确异步:

async Task init1Async();
async Task init2Async();
async Task init3Async();
Run Code Online (Sandbox Code Playgroud)

然后你可以让调用者同时调用它们,然后异步地等待它们全部完成:

async Task InitAsync() {
  var task1 = init1Async();
  var task2 = init2Async();
  var task3 = init3Async();
  await Task.WhenAll(task1, task2, task3);
}
Run Code Online (Sandbox Code Playgroud)

第三,当我在其他地方调用Init()时,是否可以用异步方法包装它?

一旦您的InitAsync方法被正确定义为返回a Task,它可以自然地使用await:

async Task doItAsync() {
  await InitAsync();
}
Run Code Online (Sandbox Code Playgroud)

请注意,这确实需要调用者async.

还建议阅读:我的异步代码MSDN最佳实践文章,特别是关于"避免异步void"和"异步一直"的部分.