作为参数传递给另一个对象的对象的事件处理

本文关键字:对象 事件处理 一个对象 参数传递 | 更新日期: 2023-09-27 18:13:00

我有一个类"Blackbox",它代表一个盒子,与我所在的实验室周围的各种机器通信。这个类是别人写的,所以我看不出它的内部是如何工作的。

我通常使用Blackbox类的方式是通过构造一个Blackbox对象,连接到物理盒,然后添加一个侦听器方法,如下所示:

Blackbox b = new Blackbox("192.168.0.2");
b.messageReceived += myFunction;

然后在相同的类中,我通常有像

这样的东西
private void myFunction(string s)
{
    // do something with s
}

这通常工作得很好,每当黑匣子从机器获得消息时,它就调用myFunction,并使用我可以处理的字符串。

现在,当我尝试将黑盒子传递到另一种形式时,问题发生了,示例代码如下(我正在以一种尽量减少(我认为是)不相关细节的方式编写代码)。希望我现在终于成功地做到了。):

static class Program
{
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Blah());
    }
}
class Blah : Form {
    public Blah()
    {
        InitializeComponent();
        Blackbox b = new Blackbox("192.168.0.2");
        MyDialog md = new MyDialog(b);
        md.ShowDialog();
    }
}
class MyDialog : Form
{
    private Blackbox b;
    public MyDialog(BlackBox b) : this()
    {
        this.b = b;
        b.messageReceived += myNewFunction;
    }
    private void myNewFunction(string s)
    {
        // this function never ends up being called
    }
}
在这里创建了对话框,除了事件侦听器之外,几乎所有东西都工作了。我可以使用其他Blackbox函数,如b.sendMessage()在MyDialog内部发送机器消息。有人知道为什么会这样吗?

此外,如果我在MyDialog中执行b. messagerreceived ("test"), myNewFunction("test")最终被调用。这就好像有两个黑盒子对象以某种方式被创造出来。这可能是由于Blackbox的实现,还是有一个更基本的c#原因?

感谢您的宝贵时间。

作为参数传递给另一个对象的对象的事件处理

您需要将Form传递给Application.Run以使其工作

http://msdn.microsoft.com/en-us/library/aa334771 (v = vs.71) . aspx

所以你的main应该是这样的:

static void main(string[] args)
{
    Blackbox b = new Blackbox("192.168.0.2");
    Application.Run(new MyDialog(b));
}

这将设置事件工作所需的消息泵。

您是否在对话框类中保留对"b"的引用?

class MyDialog : Form
{
    private BlackBox b;
    public MyDialog(BlackBox b) : this()
    {
        this.b = b;
        b.messageReceived += myNewFunction;
    }
    private void myNewFunction(string s)
    {
        // this function never ends up being called
    }
}