C#在自己的线程中执行的线程之间的事件(如何)?

Gui*_*ume 17 c# events multithreading delegates

我想要两个主题.我们打电话给他们:

  • 线程A.
  • 线程B.

线程A触发事件,线程B侦听此事件.当执行线程B事件侦听器时,它是用线程A的线程ID执行的,所以我猜它是在线程A中执行的.

我想做的是能够向线程B发起事件,例如:"嘿,数据已准备就绪,你现在可以处理它".此事件必须在其自己的Thread中执行,因为它使用只有他可以访问的内容(如UI控件).

我怎样才能做到这一点 ?

谢谢你的帮助.

Ree*_*sey 12

您需要将信息封送回UI线程.

通常,您将在事件处理程序中处理此问题.例如,假设线程A是您的UI线程 - 当它在线程B中的对象上订阅事件时,事件处理程序将在线程B内运行.但是,它可以将其封送回UI线程:

// In Thread A (UI) class...
private void myThreadBObject_EventHandler(object sender, EventArgs e)
{
    this.button1.BeginInvoke( new Action(
        () => 
            {
                // Put your "work" here, and it will happen on the UI thread...
            }));
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 9

最简单的方法可能是使用一个事件处理程序进行订阅,该处理程序只将"真正的"处理程序调用编组到线程B上.例如,处理程序可以调用Control.BeginInvoke在线程B上做一些工作:

MethodInvoker realAction = UpdateTextBox;
foo.SomeEvent += (sender, args) => textBox.BeginInvoke(realAction);

...

private void UpdateTextBox()
{
    // Do your real work here
}
Run Code Online (Sandbox Code Playgroud)