2012-01-09 4 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); 

} 

私はフォームクラス(Controlオブジェクトから継承されます)でこのイベントを使用した場合の実装は次のとおりです。

EXCを上昇
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の実装を置き換えることはできませんeption、あなたの提案は何ですか?

+0

なぜそれを呼び出す必要がありますか、どのスレッドから呼び出すのですか? – Lloyd

+0

@Lloyd更新の質問 – Saeid

+1

@romkynsが質問に答えました。 PipeServer.MessageReceivedHandlerを直接呼び出すだけでなく、UIの一部を更新している場合は、このインスタンスでInvokeを呼び出す必要があります。 – Lloyd

答えて

3

GUIスレッドでコールバックを呼び出す必要があります。そうでない場合もあります。

コールバックのGUIに触れない場合は、呼び出しを気にしないでください。

あなたはタッチにGUIを行う場合は、定義によって、あなたが更新している一部コントロールへの参照を持っている必要があります。そのコントロールのInvokeに電話してください。どのコントロールをInvokeと呼んでも問題ありません。彼らはすべて同じことをするでしょう。

関連する問題