結果として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));
}
}
}
実際にディスパッチャが呼び出す必要があるメソッドは呼び出されません。今私がウェブ上で見つけたことは、ディスパッチャーが正しいスレッドで作成されていないことと関係があり、正しいスレッドでメソッドを呼び出すことができないということです。ただし、ディスパッチャはスレッドに作成されるため、適用しないでください。
BeginInvokeの代わりにInvokeを使用してみてください。何が起こるかを報告する。 – Zenexer
同じ効果で、呼び出されません。 – ThaMe90
あなたのクラスをインスタンシエートする元のスレッドと 'Private Dispatcher dispatcher = Dispatcher.CurrentDispatcher;'は、その時点でまだアクティブなのですか? –