异步方法:
public void Main(){
await Asynctask1;
DoSomething();
}
public async Task AsyncTask1(){
//Async logic here
}
同步方法:
public void Main(){
SyncMethod1();
DoSomething();
}
我想我在这里遗漏了一些东西。假设SyncMethod1()
和Asynctask1()
都做同样的事情,这两个结构最终是不是相同的结果,即DoSomething()
在方法完成之前不会启动?< / p>
答案 0 :(得分:7)
即DoSomething()在完成之前的方法才开始?
异步和顺序之间存在差异。当您总是await
立即使用异步方法时,最终会得到异步顺序代码,乍一看似乎与同步顺序代码的行为类似。 (另一方面,这种相似性是async
/ await
关键字的完整点。但是,有一个重要的区别。
假设操作是一些I / O事情,比如获取HTTP资源。 SyncMethod1
会同步进行HTTP get;也就是说,它发出HTTP请求然后阻塞线程,直到它获得HTTP响应。 AsyncTask1
将异步进行HTTP获取;也就是说,它发出HTTP请求,然后返回不完整的Task
。稍后,当HTTP请求进入时,AsyncTask1
方法将恢复并完成返回的Task
,并运行await
之后的代码(即DoSomething
)。
异步方式更复杂但有一个关键优势:它不会阻塞线程。因此,释放UI线程以启用响应式UI,并释放ASP.NET线程以处理其他请求。
我的博客上有一个async
intro,可以帮助您学习。
答案 1 :(得分:0)
如果您已经概述了没有实际区别,因为您在继续下一步之前会等待异步方法完成。
但是,如果您重新编写类似这样的代码,您可能会意识到异步编程的强大功能:
public async void Main() {
Task performTask = AsyncTask1();
//This method can continue without having to wait for AsyncTask1 to complete
DoSomething();
//Here we await the AsyncTask1 because perhaps other code further
//down is depending on it
await performTask;
}