【问题标题】:.Net Invoke async method and await [duplicate].Net调用异步方法并等待[重复]
【发布时间】:2013-04-15 16:55:48
【问题描述】:

我有一个 ansyc 方法

public Task<Car> GetCar()
{

}

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

 Car car = await GetCar()

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

 MethodInfo method = obj.GetMethod("GetCar");
 method.Invoke( obj, null)

【问题讨论】:

标签: c# .net async-await


【解决方案1】:

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

Task<Car> result = (Task<Car>)method.Invoke(obj, null);
await result;

【讨论】:

  • @Daniel:不,await 不会阻塞当前线程。这就是await 的全部意义所在。它是真正的非阻塞。我有一个async introanother blog post,它们会更详细地介绍。
  • @Daniel:如果有帮助,您可以将async 视为将您的方法更改为状态机,每个await 都是状态机方法返回的(潜在)点。从这个角度来看,await 只是一个非常奇特的回调语法。因此,虽然await 确实会“暂停”该方法,直到可等待完成并将局部变量提升到堆上,但重要的是要注意 1)没有线程等待该方法恢复(这是一个回调,不是线程),以及 2)调用堆栈没有被保留(回调只是直接执行状态机的下一部分)。
  • @Daniel:不,没有代理,因为 await 使用回调。当操作完成时,回调方法的延续。 async 关键字告诉编译器将方法分成块(在每个await 点),然后当await 暂停时,它只是连接下一个方法块作为回调。因此,这一切都没有监视器、代理或经理;它只是一路回调。这也是调用堆栈丢失的原因;块直接作为回调运行,没有原始调用堆栈。
  • @Daniel:完成该任务的任何代码也会执行该任务的延续。在 I/O 的情况下,这是一个线程池线程。同样,这是回调,回调只是在线程池线程上执行。
  • @StephenCleary 我想我跟着。感谢您花这么多时间解释这一点!另外,我刚刚意识到我有你关于并发的书!很明显,在进行这次谈话之前,我应该读完它。 :)
猜你喜欢
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 2018-09-22
  • 2016-10-13
  • 1970-01-01
  • 2015-11-09
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多