为了账号安全,请及时绑定邮箱和手机立即绑定

服务器端C# Websocket,如何在监听取消令牌时运行循环?

服务器端C# Websocket,如何在监听取消令牌时运行循环?

C#
跃然一笑 2023-09-24 16:22:25
在我的 Vue/.NET Core 2.3 项目中,我开始用 Websockets 替换标准 AJAX 调用,其中我正在实现一个股票定价流服务,以便在股票价格实时更新时更新前端。之前的价格更新用于每 5 秒从 FE 发送一个间隔请求,以从方法获取新价格StockProcess().GetStockPricing(symbol)下面的新 Websocket 实现现在使用相同的后端 GetStockPricing() 代码,但是检查循环现在位于后端,因此当客户端连接时,该方法将继续发送回价格。作为一个原则,实现工作得很好,如果价格发生变化,该方法会将更新发送给客户端,完美。API控制器.cs[HttpGet("GetStockPricingAsync", Name = "GetStockPricingAsync")]public async Task GetStockPricingAsync(string symbol){    var isSocketRequest = ControllerContext.HttpContext.WebSockets.IsWebSocketRequest;    if (isSocketRequest)    {        WebSocket webSocket = await ControllerContext.HttpContext.WebSockets.AcceptWebSocketAsync();        await _mainController.GetStockPricingAsync(ControllerContext.HttpContext, webSocket, symbol);    }    else    {        ControllerContext.HttpContext.Response.StatusCode = 400;    }}问题是我无法取消正在运行的GetStockPricing循环:问题是行WebSocketReceiveResult result = await webSocket.ReceiveAsync(requestBuffer, CancellationToken.None);不会被执行,因为循环总是在运行,如果我将此行移到循环之前执行,那么循环也不会被触发,所以我无法同时运行循环和 ReceiveAsync 监听取消令牌。有办法实现这一点吗?在监听取消令牌的同时运行循环?
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

尝试使用 System.Threading.Tasks.Task Run中的循环来监听它


Task.Run(() => CancellationTokenFunc(...), ...);


static void CancellationTokenFunc(){

  while(true){

             //check for cancel

    }


}

在 webSocket.State 循环之前执行此操作


查看完整回答
反对 回复 2023-09-24
  • 1 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信