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

时间:2013-05-09 04:04:51

标签: c# event-handling visual-c#-express-2010

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

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

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

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

的内容
private void myFunction(string s)
{
    // do something with s
}

这通常可以正常工作,只要黑盒从机器获取消息,它就会使用我可以处理的字符串调用myFunction。

现在当我尝试将blackbox传递给另一个表单时出现问题,示例代码如下(我正在编写代码以尽量减少(我认为是)不相关的细节。希望我现在终于成功地做到了这一点。):

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
    }
}

这里创建了Dialog,除了事件监听器之外几乎所有东西都有效。我可以使用其他Blackbox函数,如b.sendMessage()在MyDialog中发送机器消息。有谁知道为什么会这样?

此外,如果我在MyDialog中执行类似:b.messageReceived(“test”)的操作,myNewFunction(“test”)最终会被调用。好像有两个Blackbox对象以某种方式创建。这可能是由于Blackbox的实现还是有一个更基本的C#原因,为什么会这样?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

您需要将Form传递给Application.Run才能使其发挥作用。

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

所以你应该看起来像:

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

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

答案 1 :(得分:1)

您是否在对话框类中保留对“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
    }

}