15
|
endian · 技术社区 · 16 年前 |
![]() |
1
22
我能想到的最重要的是
此模式还确保在编译时获得正确的强类型(与传递
显然,没有
|
![]() |
2
18
http://blogs.msdn.com/cbrumme/archive/2003/07/14/51495.aspx 说:
|
![]() |
3
16
EndInvoke()有一个有用但很少提及的行为—它重新引用委托在原始线程上下文中生成的所有未处理异常,以便您可以将异常处理逻辑移到主代码中。 此外,如果您的委托具有out/ref参数,则它们将添加到EndInvoke()签名中,以便您在方法完成执行时获取它们。 |
![]() |
4
4
如果调用ThreadPool.QueueUserWorkItem,则工作项中引发的异常将在后台线程上未处理(除非您显式捕获它们)。在.Net 2及更高版本中,这将终止您的AppDomain。 如果调用delegate.BeginInvoke(),则调用EndInvoke()时,异常将排队重新引发。如果从未调用EndInvoke(),则异常本质上是“泄漏”内存(与异步操作未释放的任何其他状态一样)。 |
![]() |
5
-1
应该没有什么大的区别,我还认为为委托生成的BeginInvoke/EndInvoke使用线程池来执行。 |
![]() |
6
-1
应该没有任何性能差异,因为Delegate.BeginInvoke和ThreadPool.QueueUserWorkItem都将在线程池线程上执行。 最大的区别是,如果调用BeginInvoke,则必须在某个时候调用EndInvoke。相比之下,ThreadPool.QueueUserWorkItem是“激发并忘记”。这有好处也有缺点。好处是你可以忘记它。缺点是,除非添加自己的同步/通知机制,否则无法知道任务何时完成。 |