为什么我们需要EndInvoke()来在委托中返回异步调用的值?

时间:2011-12-18 12:43:55

标签: c# .net asynchronous delegates

我有点麻烦理解,当异步调用方法时,委托中的BeginInvoke()方法调用,在完成它的任务之后为什么不能使用BeginInvoke()本身从方法返回返回值,为什么我们需要EndInvoke()查询BeginInvoke()并从中返回返回值。 我知道这可能不是一个好的查询,但我的困惑是真实的: - )

另外:我可以使用DelagateName.BeginInvoke(参数)异步调用方法,现在当委托中的匹配方法(假设它返回一个值)完成它的工作并返回一个值,为什么我需要DelegateName.EndInvoke()获得返回值?为什么第一个调用本身不能在方法完成时返回值。

1 个答案:

答案 0 :(得分:8)

BeginInvoke返回时,该方法尚未完成 - 这就是异步的全部意义。因此BeginInvoke只能在某个时刻为您提供表示结果“承诺”的令牌 - 并且您使用该承诺使用EndInvoke获取实际结果,通常在回调。

在.NET 4中,当然使用TaskTask<T>来更好地封装它,但是泛型不是.NET 1的一部分,因此对于代理来说,这是一种更复杂的方法。