.Net调用异步方法并等待

ajp*_*ajp 39 .net c# async-await

我有一个ansyc方法

public Task<Car> GetCar()
{

}
Run Code Online (Sandbox Code Playgroud)

我可以调用此方法异步并等待:

 Car car = await GetCar()
Run Code Online (Sandbox Code Playgroud)

如何使用MethodInfo.Invoke调用该方法并异步等待结果.

 MethodInfo method = obj.GetMethod("GetCar");
 method.Invoke( obj, null)
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 89

您可以正常调用它,然后await返回返回的任务:

Task<Car> result = (Task<Car>)method.Invoke(obj, null);
await result;
Run Code Online (Sandbox Code Playgroud)

  • @Daniel:不,“await”不会阻塞当前线程。这就是“等待”的全部意义。它是真正的非阻塞。我有一个[异步简介](https://blog.stephencleary.com/2012/02/async-and-await.html)和[另一篇博客文章](https://blog.stephencleary.com/2013/11 /there-is-no-thread.html),更详细。 (3认同)
  • @Daniel:如果有帮助,您可以将“async”视为将方法更改为状态机,并且每个“await”都是状态机方法返回的(潜在)点。从这个角度来看,“await”只是一种非常奇特的回调语法。因此,虽然 `await` 确实会“暂停”该方法,直到可等待完成并将局部变量提升到堆上,但重要的是要注意 1) 没有线程等待该方法恢复(它是一个回调,不是线程),2)不保留调用堆栈(回调只是直接执行状态机的下一部分)。 (3认同)
  • @StephenCleary 我想我遵循。感谢您花这么多时间解释这一点!另外,我刚刚意识到我有你关于并发的书!显然我应该在进行这次谈话之前读完它。:) (2认同)