Чтение отменяется до удаления потока, но все равно выдает исключение

В настоящее время я получаю исключение «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
  • Токен отмены создается из связанного источника токенов.

person Andrew Williamson    schedule 18.12.2017    source источник
comment
Покажите весь свой блок кода, чтобы мы могли лучше оценить эту проблему.   -  person jegtugado    schedule 18.12.2017
comment
Отмена IIRC чтения потока фактически не реализована. Я могу быть не прав. Ищем доказательства...   -  person spender    schedule 18.12.2017
comment
Да.. Я правильно помню. Читать (и плакать): stackoverflow.com/questions/20131434 /   -  person spender    schedule 18.12.2017
comment
Интересная статья для вас: blogs.msdn.microsoft.com/pfxteam/2012/10/05/   -  person spender    schedule 18.12.2017
comment
О, черт. Спасибо @spender, иначе я бы никогда этого не нашел. Итак, я думаю, мне нужно поймать ObjectDisposedException и проверить там токен отмены   -  person Andrew Williamson    schedule 18.12.2017
comment
ИКР? Фальшивая отмена особенно раздражает меня. Статья Туба, которую я разместил выше, выглядит как еще один вариант...   -  person spender    schedule 18.12.2017