【问题标题】:Using aspnetcore signalr as system.io stream blocking使用 aspnetcore 信号器作为 system.io 流阻塞
【发布时间】: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


【解决方案1】:

很抱歉挖掘了这个主题,但我也在尝试实现 SignalRStream。

在第一种方法中,我计划使用AutoResetEvent(或手动)来阻止读取,直到获得可用数据:目前我不知道该怎么做。

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

【讨论】:

  • 完全没有理由阻止。无论如何,所有 Stream 派生类都有异步方法,而 ASP.NET Core 真的讨厌 阻塞。无论SecureStream 类是什么,它都不是内置的.NET 类
  • 是的,您是对的,但我们的想法是客户可以知道数据何时可用,那么像 NetworkStream.DataAvailable 这样的方法对您来说是否更好?
  • 没有。客户已经知道,因为等待已完成。没有理由阻止。 SignalR 本身 需要任务
  • 关于 SecureStream,对我来说这是另一个问题:只要每个流单独工作,它们就可以一起工作。
  • 好的,谢谢 Panagiotis Kanavos,我会继续考虑的:)
猜你喜欢
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 2011-08-24
  • 2011-08-16
相关资源
最近更新 更多