使用aspnetcore signalr作为system.io流阻止

时间:2018-11-07 00:37:13

标签: c# multithreading asynchronous signalr

我正在构建一个自定义c#流,该信号由signalr支持以进行网络传输(长话短说,我目前使用包装在SecureStream中的NetworkStream进行加密)。我想使用signalr传递byte []块,但将它们通过SecureStream传递以对其进行加密。

我快完成了,但是我遇到了一个问题。 secureStream在对我的自定义流进行.read()调用,Stream.Read()方法是阻塞调用,因为这是阻塞的,所以它也在阻塞执行读取的Connection.On()方法。因此,我陷入了僵局。

基本流程是:

List<Profile> profile; // contains multiple profiles with last name of "test", potentially
String result = profile.stream()
                       .filter( pro -> pro.getLastName().equals("test"))
                       .map(Profile::getCategory)
                       .collect(Collectors.joining(", ")); // results in a comma-separated list

由于Read()调用被阻塞,因此.On()函数不会处理任何传入数据,因此永远不会填充缓存。

我尝试在单独的线程上创建HubConnectionBuilder,并尝试执行包装在Task中的Read()调用

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);
      }
  }
}

没有成功。

是的,我知道我可以在整个代码中使用异步函数来解决此问题,但是我想包装SecureStream,这意味着我必须实现阻塞的Read()调用。

有想法吗?

1 个答案:

答案 0 :(得分:0)

很抱歉,您需要深入研究这个主题,但是我也正在尝试实现SignalRStream。

在第一种方法中,我计划使用AutoResetEvent(或可能是手册)来阻止读数,直到获得可用数据为止:此刻我还不知道该怎么做。

这个想法对您有帮助吗?还是您已经解决了问题?