Delegate.EndInvoke究竟做了什么?是否有必要打电话?

时间:2011-09-26 17:10:15

标签: c# delegates invoke

  

可能重复:
  Why does asynchronous delegate method require calling EndInvoke?
  Is Delegate.EndInvoke() really necessary?

此时正在处理多线程应用程序,并且在发起事件时而不是正常进行handler.Invoke();我正在尝试使用handler.BeginInvoke();。两者都很好。但是,对于BeginInvoke,我对最后两个参数使用null,因为不需要回调,并且由于没有回调,所以绝对不需要将数据传递给不存在的回调。

因此,我根本不会调用EndInvoke。但应用程序似乎......工作得很好?我读过,人们说可能会发生泄漏,但我只是没有注意到。

我很好奇,EndInvoke究竟做了什么?我是否真的需要进行回调才能调用EndInvoke,就是这样吗?另外,为什么EndInvoke采用IAsyncResult参数?我可以直接传递null,因为没有额外的数据传递给回调,对吗?但是,我还在想,为什么,如果有额外的数据,是否需要传递给EndInvoke?这个参数做了什么?我想知道它是如何工作的。

我检查了.NET Reflector,但是找不到EndInvoke实际定义的位置。在EventHandler(我正在使用它)中,它显示的是方法头。

感谢。

3 个答案:

答案 0 :(得分:4)

主要的实际问题是确定性地清理等待句柄资源(如果您选择通过引用它来创建句柄)并确保正常传播异常。

那就是说,我建议的是在早期的.NET框架中摆脱稍微精神分裂的异步模式,并使用TPL,它具有更清晰的延续模型。 TPL甚至还有一些很好的包装功能来帮助处理旧的Begin / End调用方式:

http://msdn.microsoft.com/en-us/library/dd997423.aspx

答案 1 :(得分:1)

根据MSDN,您无论如何都应该致电EndInvoke

  

无论您使用哪种技术,请始终致电EndInvoke以完成异步呼叫。

因此,请考虑它的价值。我认为它具有前瞻性。

答案 2 :(得分:0)

正如其中一篇引用文章中所提到的,如果您以一种即发即弃的方式调用委托,您可能应该使用ThreadPool.QueueUserWorkItem。然后,您不必担心使用EndInvoke进行清理。