为什么不使用同步方法而是等待异步任务?

8

异步方法:

public void Main(){
    await Asynctask1;
    DoSomething();
}

public async Task AsyncTask1(){
    //Async logic here
}

同步方法:

public void Main(){
    SyncMethod1();
    DoSomething();
}

我觉得我在这里漏掉了些什么。假设SyncMethod1()Asynctask1()都是做同样的事情,那么这两个结构最终的结果不是一样的吗?即DoSomething()在前一个方法完成之前不会开始执行?


1
AsyncTask1的主要区别在于不会阻塞UI-->这里重要的是不会阻塞,但这并不意味着它将在另一个线程中运行!如果您想在另一个线程中运行它,则必须使用TASK。我应该把这个作为答案发布吗? - Bassam Alugili
2
并不完全相同。MSDN对差异有很好的解释:http://msdn.microsoft.com/en-us/library/hh191443.aspx - Tieson T.
@TiesonT。你是对的,因为它们在编译器中处理方式不同,我们不能说它们是相同的。我已经更新了我的评论。 - Bassam Alugili
简短回答:当您需要异步运行代码时,使用“async”。有关更多信息,请参见@TiesonT。链接非常好。 - Sinatr
2个回答

17
即DoSomething()方法要等前一个方法结束才开始执行? 异步和顺序执行有所不同。当您总是立即使用await来等待异步方法时,您会得到异步顺序代码,乍一看它似乎行为类似于同步顺序代码。(顺便说一下,这种相似性就是async/await关键字的全部意义所在)。然而,有一个重要的区别。
假设操作是某个I/O操作,例如获取HTTP资源。SyncMethod1将同步执行HTTP请求,也就是说,它发送HTTP请求,然后阻塞线程,直到获取HTTP响应。 AsyncTask1将异步执行HTTP获取;也就是说,它发送HTTP请求,然后返回一个未完成的Task。稍后,当HTTP请求到达时,AsyncTask1方法将恢复并完成返回的Task,然后运行 await 之后的代码(例如DoSomething())。
异步方式更为复杂,但具有一个关键优点:它不会阻塞线程。因此,UI线程可以释放以实现响应式UI,ASP.NET线程可以释放以处理其他请求。
我在我的博客上有一篇介绍异步编程的文章,可能对您有帮助。 async intro

1
@MartinPrikryl:在同步方法中无法使用await。问题中的代码在第一个Main上缺少async - Stephen Cleary

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接