线程中使用的代理?

时间:2009-03-19 04:55:19

标签: c# delegates

当我们在委托类型的变量上调用BeginInvoke时,内部会发生什么?

1 个答案:

答案 0 :(得分:2)

这取决于您调用BeginInvoke的对象类型。

ISynchronizeInvoke是定义BeginInvoke的接口。它将委托传递给实现该接口的对象,该对象将(应该)安排线程在其自己的主线程上运行。

有一些对象可以实现此接口。 WPF中的Dispatcher执行此操作 - 当您在调度程序上调用BeginInvoke时,该委托将添加到调度程序的队列中,并在适当时运行。

Windows窗体中的Control基类也实现了ISynchronizeInvoke(我相信这可能是你的问题所暗示的)。在Windows窗体中,事情要复杂得多。 Here is a great article解释详情。基本上,当你在winforms控件上调用BeginInvoke时会发生什么,一个特殊的编组器会创建一个传递给程序的Windows消息,并且UI线程会将该委托排队等待运行。它比这更复杂(正如那篇文章所描述的),但这是基本的想法。然后代理在主UI线程上运行。

还有其他对象实现ISynchronizeInvoke,但其中大多数是管理和运行自己的线程的对象。这些对象维护一个委托队列,并将您的队列添加到该队列中,以便它们在其线程上运行。