Использование aspnetcore signalr в качестве блокировки потока system.io - PullRequest
0 голосов
/ 07 ноября 2018

Я создаю собственный поток c #, который поддерживается сигнализатором для сетевого транспорта (короче говоря, в настоящее время я использую NetworkStream, обернутый в SecureStream для шифрования). Я хочу использовать сигнализатор для прохождения блоков 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 ().

Мысли

...