2012-01-09 48 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的控件真的沒有關係;他們都會做同樣的事情。

相關問題