使用C#MethodInvoker.Invoke()获取GUI应用程序……这样好吗?

使用C#2.0和MethodInvoker委托,我有一个GUI应用程序从GUI线程或工作线程接收一些事件。

我使用以下模式处理表单中的事件:

private void SomeEventHandler(object sender, EventArgs e) { MethodInvoker method = delegate { uiSomeTextBox.Text = "some text"; }; if (InvokeRequired) BeginInvoke(method); else method.Invoke(); } 

通过使用这种模式,我不会复制实际的UI代码,但我不确定的是这种方法是否合适。

特别是这条线

 method.Invoke() 

它是否使用另一个线程进行调用,或者它是否有点转换为直接调用GUI线程上的方法?

method.Invoke()调用在当前正在执行的线程上执行委托。 使用BeginInvoke(method)可确保在GUI线程上调用委托。

当从GUI线程和其他线程调用相同的方法时,这是避免代码重复的正确方法。

我个人喜欢这种方法:

 private void ExecuteSecure(Action a) { if (InvokeRequired) BeginInvoke(a); else a(); } 

然后你可以写这样的单行:

 ExecuteSecure(() => this.Enabled = true); 

请记住,如果您在后台线程并且Control.IsHandleCreated为false,则Control.InvokeRequired将返回false。 我会使用Debug.Assert来保护代码,以检查非托管句柄的创建。

对于WinForms,调用Control.Invoke(Delegate)将消息发送到UI的thead的消息泵。 然后线程处理消息并调用委托。 一旦处理完毕, Invoke停止阻塞,调用线程将继续运行您的代码。

它在同一个线程上进行调用。 您可以通过单步执行代码进行检查。 这种方法没有错。