【发布时间】:2018-11-07 00:37:13
【问题描述】:
我正在构建一个由信号器支持的自定义 c# 流,用于网络传输(长话短说,我目前使用包装在 SecureStream 中的 NetworkStream 进行加密)。我想使用 signalr 传递 byte[] 块,但通过 SecureStream 传递它们来加密它们。
我快完成了,但我遇到了一个问题。 secureStream 正在对我的自定义流进行 .read() 调用,Stream.Read() 方法是一个阻塞调用,因为这是阻塞的,它也阻塞了正在执行读取的 Connection.On() 方法。因此我陷入了僵局。
基本流程是:
public class SignalrStream : Stream
{
public async Task ConnectAsync() {
Connection = new HubConnectionBuilder().WithUrl(ServerURI).Build();
Connection.On<byte[]>("msg", (data) => { cache(data); });
await Connection.StartAync()
}
public override int Read(byte[] buffer, int offset, int count) {
while(true)
{
if (ConnectionClosed) { return 0;}
if (DataInCache) { copyToBuffer(buffer); return length; }
//No data is cache. Block
Thread.Sleep(100);
}
}
}
由于 Read() 调用被阻塞,任何传入的数据都不会被 .On() 函数处理,因此永远不会填充缓存。
我尝试在单独的线程上创建 HubConnectionBuilder,并尝试执行包装在任务中的 Read() 调用
public override int Read(byte[] buffer, int offset, int count)
{
Task<int> task = Task.Run(async () => { return await ReadBytesAsync(buffer,offset,count); });
task.Wait();
return task.Result;
}
没有成功。
是的,我知道我可以在整个代码中使用异步函数来解决这个问题,但我想包装在 SecureStream 中,这意味着我必须实现阻塞式 Read() 调用。
想法?
【问题讨论】:
-
如果 SecureStream 是你自己的类,为什么不直接实现 ReadAsync 而不是 Read?
-
SecureStream 是原生 .net 类
标签: c# multithreading asynchronous signalr