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)
我有一个应该有所帮助的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"和"异步一直"的部分.