我已经阅读了几个论坛,甚至有一个或两个stackoverflow问题,说使用Delegate.BeginInvoke时必须使用Delegate.EndInvoke。我读过的许多有关使用BeginInvoke的文章都没有提及使用EndInvoke。另外,我仅使用BeginInvoke部署了生产代码,并且似乎没有任何内存问题。我使用BeginInvoke的方式通常是使用我不关心的线程完成时间或处理时间。

最佳答案

从MSDN文章'Calling Synchronous Methods Asynchronously':



现在有理论,然后有实践。与您之前的其他许多开发人员一样,您发现您常常可以忽略此文档要求。 EndInvoke是否实际上执行了防止应用程序崩溃,内存泄漏等绝对必要的操作,这可能是实现细节。但是,问题是:如果它是有记录的要求,那么您真的应该这样做。这不只是理论上的问题;就是在发生变化时保护自己。

通过记录此要求,此异步调用机制的设计人员基本上可以自由地更改BeginInvokeEndInvoke的工作方式,因此,如果有充分的理由(例如,性能增强),EndInvoke可能会突然变得很多更必要。假设您忘记了它,将突然导致死锁。他们已经通过说总是叫EndInvoke来掩盖自己;如果您的应用因未遵循此要求而停止运行,则您有责任。

我并不是说这必然是一种可能的情况。我的意思是,您不应该(或者至少我不应该)询问“这真的有必要吗?”如果我可以摆脱遗漏,那么我会的,因为已被记录为您应该这样做。

关于.net - Delegate.EndInvoke()真的必要吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4585042/

10-11 22:24
查看更多