Я создаю собственный поток 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 ().
Мысли