.net - Delegate.EndInvoke() 真的有必要吗?

标签 .net delegates begininvoke

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

最佳答案

来自 MSDN 文章 'Calling Synchronous Methods Asynchronously' :

No matter which technique you use, always call EndInvoke to complete your asynchronous call.



现在,有理论,然后有实践。您发现,与之前的许多其他开发人员一样,您通常可以忽略此文档化要求。 EndInvoke可能是一个实现细节实际上会做任何绝对必要的事情来防止您的应用程序崩溃、内存泄漏等。但事情是这样的:如果这是一个记录在案的要求,你真的应该这样做 .这不仅仅是关于理论;这是关于在发生变化时保护自己。

通过记录这个需求,这个异步调用机制的设计者基本上给了自己改变方式的自由BeginInvokeEndInvoke如果有足够的理由(例如,性能增强),则继续工作,EndInvoke可能会突然变得更加必要。假设如果您忘记它会突然导致死锁。他们已经通过说总是打电话 EndInvoke 来掩饰自己。 ;如果您的应用程序因为您没有遵循此要求而停止工作,那么责任就在您身上。

我并不是说这必然是一种可能的情况。我的观点很简单,你不应该——或者至少我不会——问“这真的有必要吗?”如果我可以摆脱它,那么我会的心态,因为它记录你应该这样做。

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

相关文章:

c# - 为什么不用 .NET 风格的委托(delegate)而不是 Java 中的闭包?

c# - 从 C# 3.0 中的匿名委托(delegate)返回

c# - Backgroundworker/Control.BeginInvoke() 卡住 UI

c# - 对于给定的优先级,Dispatcher.Invoke() 和 Dispatcher.BeginInvoke() 是否相等?

.net - 有什么方法可以在我的 ASP.NET MVC Web 应用程序中模拟 Claims Principal 吗?

c# - 如何将 Lucene.Net RAMDirectory 写回磁盘?

.net - 多个连接到一个 mdf 文件

jQuery 可以 removeClass 但不能为具有 .on ("click"的元素添加类)

c# - 为什么要异步回调?

c# - 跨域 iframe 中的安全错误