【发布时间】:2026-01-03 00:35:02
【问题描述】:
我在TcpClient 之上使用SslStream。不幸的是,`SslStream` 不支持同时从多个线程写入或读取。这就是为什么我围绕它编写了自己的包装器:
private ConcurrentQueue<byte> sendQueue;
private volatile bool oSending;
private readonly object writeLock;
public async void Write(byte[] buffer, int offset, int count)
{
if (oSending)
{
lock (writeLock)
{
foreach (var b in buffer)
{
sendQueue.Enqueue(b);
}
}
}
else
{
oSending = true;
await stream.WriteAsync(buffer, offset, count);
oSending = false;
lock (writeLock)
{
if (sendQueue.Count > 0)
{
Write(sendQueue.ToArray(), 0, sendQueue.Count);
sendQueue = new ConcurrentQueue<byte>();
}
}
}
}
背后的意图如下:
- 如果流是空闲的,立即写入流。
- 如果流忙,则写入缓冲区。
- 如果流从发送返回,检查队列中是否有数据,递归发送。
到目前为止,我已经尝试了几种解决方案,但似乎每次都发送了太多数据。
P.S.:我知道按字节填充队列并不好,但这只是变得又快又脏。
更新:我已根据 Dirk 的评论添加了队列的删除。
【问题讨论】:
-
您是否曾经从队列中删除过项目?
标签: c# .net multithreading concurrency buffer