2009-09-01 83 views

回答

14

这基本上描述了一种在线程之间推动工作;要将工作项目推送到其他线程,请使用Invoke(同步)或BeginInvoke(异步 - 稍后稍后请拨打EndInvoke)。同样,InvokeRequired用于询问“我是否需要这样做?或者我可以自己执行这项工作吗?”。

此接口最常见的用法是在windows窗体中,它是如何将工作推送到UI线程的一部分;您当然可以同样使用Control.Invoke/Control.BeginInvoke,但表单控件实现此接口以允许抽象 - 因此下游代码无需将其自身绑定到Windows窗体。在表单的情况下,InvokeRequired意味着“我是否是UI线程?”。

实际上,我不确定这是直接使用它的共同点。在UI上处理事件更为常见,并且使用最合适的本地机制让UI处理线程切换。

典型用法:

obj.Invoke((MethodInvoker) SomeMethod); 

,其执行(通过一个代表)SomeMethodobj管理的线程上(它实现接口)。

+0

感谢marc它的一个很好的答案.. – 2009-09-15 05:36:25

+0

我最近查看了一个非常简单的'ISynchronizeInvoke'实现伴随着一个非常简单的'IAsyncResult'实现:http://gurkashi.blogspot.com/2011/01/hi-all-在此结果后我意志 - demonstrate.html。不喜欢这个问题,但我想知道,现在,与.Net 4.5我可以使用异步/等待,而不是回调的BeginInvoke老派模式。尽管接口说'BeginInvoke',*引擎盖下*我可以从我的4.5工具箱实现。 – IAbstract 2012-06-13 01:38:57

2

ISynchronizeInvoke Interface

的ISynchronizeInvoke接口 提供有关 一个事件的发生的对象之间的同步和异步通信 。实现此接口的对象 可以通过 接收事件发生时有 的通知,并且他们可以响应有关该事件的查询 。这样, 客户端可以确保一个请求 已被处理之前,他们提交 后续请求,取决于 完成第一个。

另请参阅

http://blogs.msdn.com/jaredpar/archive/2008/01/07/isynchronizeinvoke-now.aspx

+0

Yap ..我认为这可以用来更新主线程中的UI使用低层逻辑的后台线程? – 2009-09-01 06:05:17