Possible Duplicate:
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(这是我正在使用的)中,显示的全部是方法标头。

谢谢。

最佳答案

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

就是说,我建议您摆脱早期的.NET框架中的精神分裂症异步模式,而使用TPL,后者具有更简洁的延续模型。 TPL甚至具有一些不错的包装功能,以帮助处理较旧的Begin / End调用样式:

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

关于c# - Delegate.EndInvoke到底做什么?有必要打电话吗? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7558634/

10-13 04:01