2017-05-30 10 views
1

私は、待機しているときにwriteAsyncを待つようにネットワークストリームに信号を送る方法を試していました。以下のように、stream.readasyncメソッドから戻るメカニズムが不明でした。私は、ストリームへの書き込みを可能にする完了するタスクを通知する方法を思いついた。このコードは、そのアプローチで間違っているようです。より良いアプローチがあるでしょうか?ネットワークストリーム信号がデータを送信するのを待っています

async Task SocketStuff(TcpListener listener) 
    { 
     TcpClient client = await listener.AcceptTcpClientAsync(); 
     NetworkStream stream = client.GetStream(); 
     var buf = new byte[2048]; 
     var readTask = stream.ReadAsync(buf, 0, buf.Length); 
     var signalToSend = SignalReadyToSendAsync(); 
     var completetedTask = await Task.WhenAny(readTask, signalToSend); 
     if (completetedTask == signalToSend) 
     { 
      await stream.WriteAsync(someData, 0, someData.Length); 
     } 
     if (completetedTask == readTask) 
     { 
      // ..... 
     } 
    } 
    async Task SignalReadyToSendAsync() 
    { 
     while (nothingToSend) 
     { 
      await Task.Delay(250); 
     } 
     return; 
+2

データが利用可能であることがわかったコードから直接データを送信するだけではどうですか?送信と受信を同時に行うことができます。 –

答えて

1

Streamをメソッド内で完全に処理したい場合は、これが方法です。しかし、私はあなたがStreamのインスタンスを格納し、ストリームに直接データを書き込む関数を公開する、別のクラスに全体をラップすることをお勧めします。

だから、基本的にあなたが持っているメソッド:このメソッドは外部から呼ばれ

Task SendData(byte[] data) 
{ 
    return stream.WriteAsync(someData, 0, someData.Length); 
} 

を、毎回データを送信する必要があります。ラッピングクラスは、streamをクラスレベル変数として格納する必要があります。

基本的には、ネットワークストリームを使用してクラスを作成し、データを受信して​​処理(または転送)する機能を自動的に開始します。

すべてを1つのメソッド内で処理するのは難しく、すべてをより複雑にすることに気付いたようにサポートクラスが必要です。

0

私は、1つの方法を使用することは理解しやすいと思うが、msgが送信される準備ができたら完了したタスクに到達できる必要がある。あなたは、タスクを設定してこれを行うことができます:MSGはそのサイクルの終わりを知らせるために送られる準備ができたとき

  Task msgReadyTask = Task.Delay(Timeout.Infinite, mrtToken); 

mrtTokenをキャンセルすることができます。

関連する問題