可能重复:
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(我正在使用它)中,它显示的是方法头。
感谢。
答案 0 :(得分:4)
主要的实际问题是确定性地清理等待句柄资源(如果您选择通过引用它来创建句柄)并确保正常传播异常。
那就是说,我建议的是在早期的.NET框架中摆脱稍微精神分裂的异步模式,并使用TPL,它具有更清晰的延续模型。 TPL甚至还有一些很好的包装功能来帮助处理旧的Begin / End调用方式:
答案 1 :(得分:1)
答案 2 :(得分:0)
正如其中一篇引用文章中所提到的,如果您以一种即发即弃的方式调用委托,您可能应该使用ThreadPool.QueueUserWorkItem。然后,您不必担心使用EndInvoke进行清理。