我必须从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的形式公开,以便前端显示。
问:我需要处理多线程吗?在什么情况下必须实现数据并发访问?缓冲区需要是线程安全的吗?
1条答案
按热度按时间iyfjxgzm1#
你很少需要多线程。
使用async/await在单线程上下文中工作得很好(即UI程序)。
如果您在多线程上下文中运行它,如控制台程序,则可能会有点困难。但只要你尽快等待任何任务,你应该没事。这应该可以防止在任何时间点运行多个线程,至少对于 * 您的 * 代码来说是这样。
你的具体例子对我来说看起来很好。
如果您使用多线程代码,即例如
Task.Run
,你需要确保你的代码是线程安全的。