2017-03-03 23 views
0

,因爲我無法找到任何方式進行數據偷看如要求在How to peek StreamSocket for data in UWP apps現在我想(不消耗緩衝區讀取數據)做我自己的「偷看」,但仍然沒有運氣。在UWP StreamSocket,我可以讀取超時數據和離開的連接,如果超時開放經過

我不明白我怎麼可以從StreamSocket中,這將讓我使用超時和離開的情況下,可用的連接,如果超時時間的方式讀取數據。

最後,這個問題如下。在我看來,IMAP客戶端,我從服務器獲得響應,如果此響應是否定的,我需要稍等一下以查看服務器是否立即發送另一個響應(有時,服務器可以這樣做,並提供額外的詳細信息關於錯誤甚至零封包來關閉連接)。如果服務器沒有發送另一個響應,我很好,只是離開方法並返回給調用者。然後主叫方可以發送更多的數據到流中,接收更多的響應等。

因此,在發送請求並獲得初始響應之後,我需要在一些情況下以非常小的超時間隔再次讀取套接字,並且如果否數據到達,什麼都不做。

回答

1

可以使用CancelationTokenSource生成超時和停止異步操作。 該DataReaderStreamSocket的輸入流消耗的數據。當至少有一個字節的數據時,它的LoadAsync()方法將會返回。在這裏,我們添加一個取消源,在1秒鐘後取消異步任務,如果沒有數據消耗,則停止DataReader.LoadAsync()。

var stream  = new StreamSocket(); 

var inputStream = stream.InputStream; 

var reader  = new DataReader(inputStream); 
reader.InputStreamOptions = InputStreamOptions.Partial; 

while(true) 
{ 
    try 
    { 
     var timeoutSource = new CancellationTokenSource(TimeSpan.FromSeconds(1)); 
     var data = await reader.LoadAsync(1).AsTask(timeoutSource.Token); 

     while(reader.UnconsumedBufferLength > 0) 
     { 
      var read = reader.ReadUInt32(); 
     } 
    } 
    catch(TaskCanceledException) 
    { 
     // timeout 
    } 
} 

不要忘了配置DataReader會關閉流和連接。

+0

感謝。但是,如何在DataReader完成其工作之後擺脫DataReader?然後,我需要將連接返回到與之前相同的狀態。理想情況下,我需要能夠將它連接到現有連接並在連接生命週期中多次分離它。 – Alex

+1

您可以使用DetachStream()從閱讀器中分離Stream:https://docs.microsoft.com/en-us/uwp/api/windows.storage.streams.datareader#Windows_Storage_Streams_DataReader_DetachStream。這將允許您在處理讀取器時保持Stream暢通。 – Vincent

+0

糟糕,當檢查DataReader時,我發現我已經在我的其他代碼中使用它以達到完全相同的目的,並且似乎我完全忘記了我已經在幾個月前的早些時候解決了此任務..難以置信.. – Alex

相關問題