2017-05-30 38 views
1

我想了解如何發信號通知NetworkStore在等待時等待writeAsync readasync.I不確定從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存儲爲類級變量。

基本上你使用網絡流創建類,它會自動啓動一個接收數據並處理(或轉發)它的函數。

在一個方法中處理它是棘手的,並且需要支持類,因爲您注意到這使得一切都變得更加複雜。

0

我認爲使用一種方法很容易理解,但只需要能夠在msg準備好發送時完成已完成的任務。您可以通過設置任務來執行此操作:

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

當msg準備好發送以指示該週期結束時,可以取消mrtToken。