В настоящее время я получаю исключение «ObjectDisposed», и я не уверен, как его разрешить. Я убедился, что проверяю, что поток не закрыт, прежде чем начать операцию чтения:
token.ThrowIfCancellationRequested();
int amount = await stream.ReadAsync(buffer, offset, buffer.Length - offset, token);
Прежде чем закрыть поток, я отменяю все ожидающие чтения:
tokenSource.Cancel();
stream.Close();
Тем не менее, я все еще получаю следующее исключение:
Не удается получить доступ к удаленному объекту. Имя объекта: «System.Net.Sockets.NetworkStream».
Это ложно, так что это похоже на состояние гонки, но это происходит достаточно часто, чтобы я мог его воспроизвести. Кажется, есть три возможности:
CancellationTokenSource
не является атомарным (быстрый гугл на это не ответил)NetworkStream
дает удалению более высокий приоритет, чем отмене- Какая-то другая причина, по которой мне не хватает
Как я могу справиться с этим более изящно? Имейте в виду следующие ограничения, с которыми я сейчас работаю:
- Поток используется в долгоживущем классе-оболочке, который может не находиться в блоке
using
. - Поток из сокета, обернутого
NetworkStream
- Токен отмены создается из связанного источника токенов.