2016-12-29 83 views
2

我在寫一個服務器,它使用一個System.Net.WebSockets.WebSocket接收客戶端數據。NETCore.App WebSockets CancellationToken

var data = await webSocket.ReceiveAsync(requestBuffer, httpContext.RequestAborted); 

服務器應該能夠取消ReceiveAsync任務如果客戶端斷開連接而不關閉連接(例如,如果客戶端崩潰)。 因此,我使用了Microsoft.AspNetCore.Http.HttpContext的的RequestAborted CancellationToken。但它不適用於它。

我不確定是否必須實施具有超時的CancellationToken。在客戶端,我可以實現在超時間隔內發送的「KeepAlive」消息。有人會告訴我一個帶有超時的CancellationToken實現嗎?

[更新]

證明,我可以用這個的CancellationToken:

CancellationTokenSource source = new CancellationTokenSource(10000); 
var request = await session.Socket.ReceiveAsync(requestBuffer, source.Token); 

我認爲它會後10000毫秒取消任務並繼續執行。相反,它會在120000毫秒後拋出OperationCanceledException。我可以忍受那個......但我仍然想知道時差。我保持這個問題的開放,希望有人能夠說出這件事。

+2

的'Token'將被自動設置爲取消10秒後這是罰款。 但是,實際的中止是通過執行'ReceiveAsync'來完成的,由於它在120秒後中止,所以明顯不能很好地取消。 你不能做太多的事情。 – Dusan

回答

0

FWIW,我結束了使用象下面這樣的東西來「處理」這樣的:

var task = socket.ReceiveAsync(buffer, _cts.Token); 

while (!task.IsCompleted && !_cts.IsCancellationRequested) 
{ 
    await Task.Delay(100).ConfigureAwait(false); 
}