事件处理作为参数传递的对象为

问题描述:

我有一个类“黑盒子”,它代表了一个盒子,周围我在实验室里各种机器进行通信。这个类是别人写的,所以我不能看到另一个对象它的内部是如何工作的。事件处理作为参数传递的对象为

我通常使用的黑盒类的方法是通过构建一个黑箱对象,连接至所述物理框,然后添加监听方法如下:在相同

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中发送机器消息。有谁知道为什么会发生这种情况?

而且,如果我这样做:b.messageReceived( “测试”)内MyDialog,myNewFunction( “测试”)最终被调用。就好像有两个以某种方式创建的Blackbox对象。这可能是由于Blackbox的实施或者是否有一个更基本的C#原因,为什么这是?

谢谢你的时间。

你需要通过你的FormApplication.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)); 
} 

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

+0

感谢您的回答。看来我没有更好地提出这个问题的代码可能让我错过了一些重要的东西。对我而言,没有主要的方法,而是从另一个表单调用对话框。当我尝试从它内部调用Application.Run()时,我得到一个“InvalidOperationException”,说我无法在单个线程中启动第二个消息循环。我将在我的问题中编辑代码,对此感到抱歉。 – muzzlator 2013-05-09 04:18:46

你在对话类中保留对“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 
    } 

} 
+0

对不起,还有更多的细节,我可能应该保留。是的,我保留一个参考。我试图减少代码,以便我没有最终得到一个大问题 – muzzlator 2013-05-09 05:07:53

+0

不幸的是,我认为我们需要看到更多的代码来弄清楚。它与md.Show();与'md.ShowDialog();'有什么不同? – 2013-05-09 12:29:18

+0

它使用md.Show()也不会有任何不同。所以看起来好像它不是与对话相关的。当我明天可以访问它时,我会提供更多代码,但不幸的是,我现在无法访问我所在的位置。非常感谢,感谢帮助。 – muzzlator 2013-05-09 14:49:39