我在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的评论添加了队列的删除。
您是否曾经从队列中移除项目? – Dirk