2016-01-04 4 views
2

Следующие две строки кода выполняют один за другим:Что означает DataWriter ObjectDisposedException?

this.dataWriter.WriteBytes(message.MessageBuffer); 
await this.dataWriter.StoreAsync(); 

Хотя WriteBytes вызов завершается без исключения, в StoreAsync вызов прямо под него бомбы с ObjectDisposedException и говорит

объекта был закрыт. (Исключение из HRESULT: 0x80000013)

this.DataWriter (Windows.Storage.Streams.DataWriter) не равно нулю, так что именно это говорю, "закрыто?"

EDIT

Просто для некоторых дальнейшего контекста о том, как создаются объект

this.socket = new StreamSocketListener(); 
this.socket.ConnectionReceived += this.EventSocketConnectionReceived; 
private void EventSocketConnectionReceived(StreamSocketListener sender, 
    StreamSocketListenerConnectionReceivedEventArgs args) 
{ 
    if (this.dataWriter == null) 
    { 
     this.dataWriter = new DataWriter(args.Socket.OutputStream); 
    } 
} 
+0

Какой тип dataWriter? –

+0

Windows.Storage.Streams.DataWriter –

+0

Как выглядит конструктор для 'dataWriter' в вашем коде? Что вы передаете? –

ответ

2

У меня нет опыта работы с 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.

Мое предположение, что поток закрывается вызывающим событием, или же сокет закрывается удаленным клиентом (возможно, из-за таймаута?). Я не знаю, есть ли правильный способ сохранить этот поток, если он первый. Но это, вероятно, то, где вы должны поставить свое время исследования.

+0

@cFrozenDeath Отслеживает ли «WriteBytes» базовый поток? Я бы предположил, что нет, и в этом случае эта деталь не имеет значения. Вот почему я вскочил на то, что я сказал в первую очередь, а не на очевидный выбор, который мог бы сам «DataWriter». –

+0

@MatthewHaugen - автор не размещен и не является нулевым, если только вы не можете иметь объект, который не является нулевым, но расположен .... –

+0

@ O.O Вы можете. Утилизация просто означает, что вызывается 'Dispose()', что может произойти в любой точке, как и любой другой метод. Обычно вы хотите избавиться от него, но это не гарантия контракта. –

Смежные вопросы