假设我有这段代码:
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();
}
答案 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();