使用async运行多个方法

时间:2014-10-03 01:06:30

标签: c# asp.net asp.net-mvc asynchronous

假设我有这段代码:

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

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

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

public async void Init(){
    init1();
    init2();
    init3();     
    await ... all finished
}

第三,当我在其他地方呼叫Init()时,是否可以用async方法包裹它?如下面的代码,或者它必须是async

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

public void doIt(){
  Init();
}

2 个答案:

答案 0 :(得分:6)

我有一个应该有帮助的async intro

  

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

不,你并不需要在Stack Overflow上问这个问题,因为编译器本身会给你一个警告,明确指出你的方法会同步运行。

  

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

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

async Task init1Async();
async Task init2Async();
async Task init3Async();

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

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

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

InitAsync方法正确定义为返回Task后,可以使用await自然消费:

async Task doItAsync() {
  await InitAsync();
}

请注意,此确实要求来电者为async

还建议阅读:我的Best Practices for Asynchronous Code MSDN article,特别是"避免异步无效"并且"一直异步"。

答案 1 :(得分:0)

您还可以在每种方法上等待一件事,以获取每种方法所需的结果。

var task1 = await init1Async();
var task2 = await  init2Async();
var task3 = await init3Async();