C# WebSocket firehose和线程
问题描述
我有一个C# WebSocket客户端。当我收到一条消息时,处理的时间可能会比接收到新消息的时间更长。基本上,我想要单线程运行,只是忽略中间的消息,这样就不会陷入困境和落后。.net生态系统有很多用于管理线程的选项和对象,我想听听关于构建此解决方案的最佳方式的一些建议。
解决方案
我不明白你为什么需要这个,但是如果我理解正确,一个简单的标志可以帮助解决问题。
using System;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
public class WebSocketClient
{
private readonly ClientWebSocket socket;
private bool isProcessing = false;
public WebSocketClient()
{
socket = new ClientWebSocket();
}
public async Task ConnectAsync(Uri uri)
{
await socket.ConnectAsync(uri, CancellationToken.None);
}
public async Task ReceiveMessagesAsync()
{
while (socket.State == WebSocketState.Open)
{
var buffer = new ArraySegment<byte>(new byte[1024]);
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Text)
{
string message = System.Text.Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
if (!isProcessing)
{
_ = ProcessMessageAsync(message);
}
}
}
}
private async Task ProcessMessageAsync(string message)
{
isProcessing = true;
// Your message processing logic here
await Task.Delay(2000); // Simulate a time-consuming operation
Console.WriteLine($"Processed message: {message}");
isProcessing = false;
}
}