如何设置WebSocket.ReceiveAsync的超时

如何设置WebSocket.ReceiveAsync的超时,websocket,Websocket,似乎WebSocket.ReceiveAsync可能永远等待数据。有没有办法设置非活动超时?下面是代码在概念上的外观: public async Task DoListening(AspNetWebSocketContext context) { WebSocketReceiveResult receiveResult = await socket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), Cancellation

似乎WebSocket.ReceiveAsync可能永远等待数据。有没有办法设置非活动超时?下面是代码在概念上的外观:

public async Task DoListening(AspNetWebSocketContext context)
{
    WebSocketReceiveResult receiveResult = await socket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
    if (inactivity timeout ocurred)
    {
        DoInactivityAction();
    }
    else
    {
        DoReceiveAction();
    }
}
公共异步任务数据列表(AspNetWebSocketContext)
{
WebSocketReceiveResult receiveResult=等待套接字.ReceiveAsync(新的ArraySegment(receiveBuffer),CancellationToken.None);
如果(出现不活动超时)
{
DoInactivityAction();
}
其他的
{
DoReceiveAction();
}
}
您可以使用自定义

公共异步任务数据列表(AspNetWebSocketContext)
{
var timeOut=新的CancellationTokenSource(500).Token;
WebSocket接收结果接收结果;
尝试
{
receiveResult=Wait socket.ReceiveAsync(新的ArraySegment(receiveBuffer)),超时;
DoReceiveAction();
}
捕捉(操作取消异常)
{
DoInactivityAction();
}
}

未测试的代码。

啊,我在看CancellationToken,而不是CancellationTokenSource。谢谢这会引发TaskCanceledException并将套接字置于中止状态,在套接字无法再次使用之后,如果您尝试,它将引发异常。如果不创建一个全新的WebSocket,则无法重试此操作根本不起作用,如果将来的数据实际发送,则不会引发任何异常,并且套接字会中止
public async Task DoListening(AspNetWebSocketContext context)
{
    var timeOut = new CancellationTokenSource(500).Token;
    WebSocketReceiveResult receiveResult;
    try
    {
        receiveResult = await socket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), timeOut );
        DoReceiveAction();
    }
    catch(OperationCancelledException)
    {
        DoInactivityAction();
    }
}