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

moh*_*691 6 .net c# delegates asynchronous

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

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

Jon*_*eet 8

BeginInvoke返回时,该方法还没有完成-这是它是异步的,整点.因此BeginInvoke,只能在某个时刻为您提供表示结果"承诺"的令牌 - 并且您使用该承诺来获取实际结果EndInvoke,通常是在回调中.

在.NET 4中,使用TaskTask<T>当然是更令人愉快的封装,但泛型不是.NET 1的一部分,因此对代表来说有点更复杂的方法.


Cra*_*ket 8

如果您想要异步调用委托,则只需要BeginInvoke匹配和匹配EndInvoke,即它不会阻止当前线程.这对于长期运行的方法或方法很有用,这些方法或方法调用您不能控制的进程,例如跨应用程序边界

根据您的描述,您可能最好使用Invoke将在同一方法中返回值的方法 - 并在同一线程上,即同步.当然,在这种情况下,您的线程可能会被长时间运行的进程阻止.这取决于你想要做什么.