У меня нет опыта работы с Windows.Storage.Streams.DataWriter
, но моей ставкой является то, что вы передаете его поток, закрыв , затем называя это. Вероятно, это не dataWriter
, который даже бросает исключение, хотя взгляды на Stack Trace скажут вам.
Этот код вызовет эту ошибку, и это очень легко сделать ошибку:
Windows.Storage.Streams.DataWriter dataWriter;
using (var file = File.OpenRead("..."))
{
dataWriter = new DataWriter(file);
}
dataWriter.WriteBytes(message.MessageBuffer);
await dataWriter.StoreAsync();
Выбытие имеет мало общего с непосредственно null
. Редко бывает много общего с тем, что есть, поэтому мы делаем его нулевым, но это необязательно.
Я проверил бы, какой поток вы передаете в конструктор, а затем ищите ссылки на этот поток, который может утилизировать его (либо через блок , как я показал здесь, либо явный вызов до stream.Dispose()
).
Существует бесконечная комбинация линий для его броска, и маловероятно, что то, что у вас есть, так же просто, как и все, что я говорю здесь (оно, вероятно, распространяется по конструкторам и методам и смешивается с несвязанным кодом) , Но я фактически гарантирую, что это что-то вроде этой картины.
Просто так это звучит как есть некоторые разногласия, проблема здесь в том, что это difficult to tell if something is disposed, не говоря ему делать что-то.
Потому что DataWriter
по существу кэширует операции, он не разговаривает с основным потоком, пока не позвонит StoreAsync()
. Вот почему WriteBytes
не является асинхронным. Вы можете представить себе реализацию, которая просто связывает их с List<byte>
(хотя, конечно, это будет намного сложнее, чем это).
Но когда вы вызываете метод StoreAsync()
, он обращается к потоку и говорит «напишите этот материал, который я закрепил». Поток пытается, но он уже закрыт, поэтому он выбрасывает это исключение.
Вот почему он не бросает на первую строчку, а делает на второй. И почему я рискую предположить, что это расположенный поток, по сравнению с самим DataWriter
.
В соответствии с вашими изменениями и комментариями ваш поток поступает из событий args.
Мое предположение, что поток закрывается вызывающим событием, или же сокет закрывается удаленным клиентом (возможно, из-за таймаута?). Я не знаю, есть ли правильный способ сохранить этот поток, если он первый. Но это, вероятно, то, где вы должны поставить свое время исследования.
Какой тип dataWriter? –
Windows.Storage.Streams.DataWriter –
Как выглядит конструктор для 'dataWriter' в вашем коде? Что вы передаете? –