2012-01-09 17 views
0

我使用了一些代表和事件来实现这样了NamedPipes:如何调用控制类中没有的一些方法

public delegate void MessageReceivedHandler(byte[] message, Client client); 

public event MessageReceivedHandler MessageReceived; 

void ListenForClients() { 

//Do some 

Thread readThread = new Thread(Read) { IsBackground = true }; 

} 

void Read(object clientObj) { 

//Do Some 

if(MessageReceived != null) 
MessageReceived(ms.ToArray(),client); 

} 

当我在Form类使用此事件(从Control继承对象),实现如下:

public partial class Form1 : Form { 

public Form1(){ 
    pipeServer.MessageReceived += pipeServer_MessageReceived; 
} 

    void pipeServer_MessageReceived(byte[] message, PipeServer.Client client) { 

     Invoke(new PipeServer.MessageReceivedHandler(Do_pipeServer_MessageReceived), 
        new object[] { message, client }); 
    } 

    public void Do_pipeServer_MessageReceived(byte[] message, PipeServer.Client client) { 
    // Do Some 
    } 
} 

但是,当我想,不是从控制对象继承了一些其他类使用这个我不能Invoke任何方法,也是我不能代替在祈求方法pipeServer_MessageReceived实现目标的方法Do_pipeServer_MessageReceived的是上升的EXC eption,那么你的建议是什么?

+0

为什么你需要调用它,你调用了哪个线程? – Lloyd 2012-01-09 11:24:18

+0

@劳埃德更新问题 – Saeid 2012-01-09 11:32:42

+1

@romkyns已回答了问题。如果您不是直接调用PipeServer.MessageReceivedHandler,而只是更新UI的某些部分,则只需在此实例中调用Invoke。 – Lloyd 2012-01-09 11:46:51

回答

3

有两种可能性:您需要在GUI线程上调用回调,或者您不需要。

如果您不在该回调中触摸GUI,那么请不要打扰调用。

如果触摸界面,则必须通过定义有参考一些控制你更新。在该控件上调用Invoke。你称之为Invoke的控件真的没有关系;他们都会做同样的事情。

相关问题