AsyncAwait概念

man*_*ish 0 c# multithreading asynchronous async-await

我试图理解异步和等待的概念,并不能完全掌握它的概念.直到我学到的是Async-await,如果我们调用方法-A然后使用方法-A中的await调用方法-B那么方法-A的提醒将仅在方法-B的工作完成之后运行.我错过了什么吗?请指正.

如果是这种情况,那么即使使用同步编程我们每次调用方法时,方法-A的提醒都会等到我们完成调用方法-B之后?

public void methodA(){
methodB();
Console.Writeline("MethodB has been called");
}
public void methodB(){//do stuff}
Run Code Online (Sandbox Code Playgroud)

现在使用异步等待:

public async Task methodA(){
await methodB();
Console.Writeline("MethodB has been called");
}
public async Task methodB(){//do stuff}
Run Code Online (Sandbox Code Playgroud)

请介意我显示差异?我很难抓住这个概念.一般来说,我看到ThreadPool和Threads上的帖子,但没有一个明确的概念,我不太明白.

Dam*_*ver 5

async并且await是关于让线程做有用的工作而不是懒散地等待其他工作完成.

如果我们编写代码来创建一个新线程来做一些工作,然后立即阻止我们当前的线程等待它完成,这是一种浪费.为什么我们不只是在我们当前的线程上运行代码并让它完成有用的工作,并节省自己创建新线程的开销?1

那么,该怎么await办?它允许我们当前的方法比其所有工作完成时更快地返回其调用者.也就是说,我们表示我们当前没有使用我们正在运行的线程,但希望我们的调用者或调用者调用者等确实有其他东西可以在我们的线程上运行.

如果我们的方法还有其他可以在当前线程上有用的东西怎么办?容易 - 将等待创造await自身分离,并在以下之间进行其他有用的工作:

public async Task methodA(){
  var mba = methodB();
  Console.Writeline("MethodB has been called");
  //Other useful work that doesn't depend on methodB
  var result = await mba
  //And now continue with the result from methodB
}
Run Code Online (Sandbox Code Playgroud)

methodB它本身如何实现其异步完全是一个实现细节methodB- 我们所知道的是它被安排Task在未来的某个时间点完成它的返回(这就是为什么其他语言使用诸如"期货"或"承诺"之类的术语,我们使用"任务")


1对于那些想知道为什么这个段落存在的人来说,它恰好反驳了await"创造一个新线程"或类似的所有常见的主张.