2012-02-08 10 views
0

結果としてNetworkStream上の非同期読み取り操作にメソッドを起動しようとしています。読み取り操作はBeginReadとEndReadを介して行われ、BeginReadで指定されたコールバックでEndReadが呼び出されます。すべてのかなり基本的なもの。今、システムが生成したスレッドでコールバックが行われるので、NetworkStreamから読み取られたデータは、もはや私のスレッドによって所有されなくなりました。これはBeginReadと呼ばれています。それを克服するため、私はスレッドのディスパッチャを介して呼び出すことを試みるデータをさらに処理するメソッドを書きました。このように見てコールバックしてディスパッチャによってディスパッチされたデリゲートは一度も実行されません

// These are created in my Thread 
private delegate void ReceiverCallback(IPEndPoint sender, byte[] data); 
private Dispatcher dispatcher = Dispatcher.CurrentDispatcher; 

private void DataReceived(IAsyncResult result) 
{ 
    DataReceivedStruct drs = (DataReceivedStruct)result.AsyncState; 
    NetworkStream used = drs.stream; 
    AutoResetEvent handle = drs.waitHandle; 
    used.EndRead(result); 
    DispatchRaiseReceived(readBuffer); 
    handle.Set(); 
} 

DataReceivedStructはNetworkStreamとAutoResetEventを保持するシンプルな構造体です。 ReadBufferはBeginReadとEndReadが同じメソッドで呼び出されないため、1024長さのグローバルプライベートバイト[]です。

DispatchRaiseReceive方法は、次のようになります。ソケットがれるtcpClientオブジェクトです

private void DispatchRaiseReceived(byte[] data) 
{ 
    dispatcher.BeginInvoke((ReceiverCallback)RaiseReceived, socket.Client.RemoteEndPoint, data); 
} 

Disptachedメソッドは、次のコードのように見えます。これは単に後続の処理のためにイベントを介してデータを渡すだけです。

private void RaiseReceived(IPEndPoint sender, byte[] data) 
{ 
    if(IsEnabled){ 
     if (Received != null) 
     { 
      Received(this, new TCPDataArgs(sender, data)); 
     } 
    } 
} 

実際にディスパッチャが呼び出す必要があるメソッドは呼び出されません。今私がウェブ上で見つけたことは、ディスパッチャーが正しいスレッドで作成されていないことと関係があり、正しいスレッドでメソッドを呼び出すことができないということです。ただし、ディスパッチャはスレッドに作成されるため、適用しないでください。

+0

BeginInvokeの代わりにInvokeを使用してみてください。何が起こるかを報告する。 – Zenexer

+0

同じ効果で、呼び出されません。 – ThaMe90

+0

あなたのクラスをインスタンシエートする元のスレッドと 'Private Dispatcher dispatcher = Dispatcher.CurrentDispatcher;'は、その時点でまだアクティブなのですか? –

答えて

0

これを修正する試みとして、私はUIスレッドから明示的にDispatcherを取得し、それを使用したい希望の場所に渡しました。これはDispatcher.CurrentDispatcherで取得しようとするのではなく、これです。そして、あなたは何を知っています、それは働いた。デリゲートは現在正しく呼び出されています。

明らかにDispatcher.CurrentDispatcherが届かなかったDispatcher私はそれを使いたいと思っていました。

+0

Dispatcher.CurrentDispatcherはディスパッチャを現在のスレッドから受け取ります。プロセスごとに1つのディスパッチャはありません。 – usr

+0

私はそれを知っていますが、Dispatcher.CurrentDispatcherを呼び出したオブジェクトがメインのUIスレッドで作成されたので、使用することは大丈夫だと思いました。私は間違っていたと思う。 – ThaMe90

関連する問題