C#:Control.BeginInvoke在哪里运行?

时间:2009-09-16 11:57:59

标签: c# winforms multithreading

这种方法究竟做了什么?我在想它可能会进入一个单独的线程,但是在正确的线程上处理控制更新等事情。但现在我开始认为它可能只是在UI线程上运行。这意味着从UI调用控件上的BeginInvoke与调用Invoke几乎相同?或?

4 个答案:

答案 0 :(得分:5)

它基本上将委托添加到“要执行的任务”的队列中。 UI线程按顺序运行这些任务。

Control.InvokeControl.BeginInvoke之间的区别基本上是Control.Invoke阻止工作线程,直到任务在UI线程上执行,而BeginInvoke则不然。当您从UI线程调用它时,我不确定 offhand BeginInvokeInvoke之间是否存在任何差异。

答案 1 :(得分:0)

我不是100%肯定我得到了最后一句话。

它包含“来自UI ...”,这是否意味着“你从UI所在的同一个线程调用BeginInvoke?”或者“来自UI的控件”,即作为UI的一部分的控件?

无论如何,这两种方法都会在UI所在的同一个线程上运行有问题的委托。区别当然是Invoke块,而BeginInvoke则不然。阻塞与执行调用的线程有关。

答案 2 :(得分:0)

Control.BeginInvoke通常用于更新创建UI的线程上的UI / Control 。 UI元素具有设计约束,只能从创建线程更新它们。

因此,要从不同的(工作者/线程池)线程更新UI,您必须切换到正确的线程。 Control.BeginInvoke为您执行此操作 - 异步(在您执行委托之前不会阻塞)。调用执行相同的操作,除非您阻止代理执行。

1st google result - WinForms UI Thread Invokes: An In-Depth Review of Invoke/BeginInvoke/InvokeRequred

答案 3 :(得分:0)

请注意,如果使用Control.BeginInvoke调用返回某些内容的委托,则可以使用Control.EndInvoke访问返回的值。如果委托尚未执行,则EndInvoke将阻塞,直到它返回。