使用WebSocket接收数据时是否应该考虑多线程

4urapxun  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(159)

我必须从WebSocket URL读取数据(提供完整的Web套接字端点。即'wss://someURL/ws/WebSocket')。响应是基于信息的JSON。事实上,这些都是IOT设备的事件。

示例响应:

{
  "device_id": "ce95003e-a619-4992-bc47-e4473816158d",
  "id": "dae69be5-8da0-459c-af2f-683ca0f7e4a1",
  "timestamp": "2016-03-15T19:35:16.500014Z",
  "status": "running"
}

字符串
设备状态可以是运行、已修复、出错和空闲。如果设备状态出错,将自动修复,并在将其重新设置为空闲之前发送修复事件。
我现在使用以下代码与WebSocket连接以接收数据。

ClientWebSocket webSocket = new ClientWebSocket();
    try
    {
        byte[] buffer = new byte[1024]; // storing data here, Could be Concurrent Queue ???

        await webSocket.ConnectAsync(new Uri("wss://someURL.io/ws/websocket"), CancellationToken.None);
        while (true)
        {
            WebSocketReceiveResult result = await webSocket.ReceiveAsync(buffer, CancellationToken.None);
            string data = Encoding.UTF8.GetString(buffer, 0, result.Count);
            Console.WriteLine(data);
        }
    }
    catch(Exception ex)
    {

    }


这些数据稍后将保存在数据库或内存中(也许无所谓)。但是数据需要以基于JSON的API的形式公开,以便前端显示。
问:我需要处理多线程吗?在什么情况下必须实现数据并发访问?缓冲区需要是线程安全的吗?

iyfjxgzm

iyfjxgzm1#

你很少需要多线程。
使用async/await在单线程上下文中工作得很好(即UI程序)。
如果您在多线程上下文中运行它,如控制台程序,则可能会有点困难。但只要你尽快等待任何任务,你应该没事。这应该可以防止在任何时间点运行多个线程,至少对于 * 您的 * 代码来说是这样。
你的具体例子对我来说看起来很好。
如果您使用多线程代码,即例如Task.Run,你需要确保你的代码是线程安全的。

相关问题