[英]What does DataWriter ObjectDisposedException mean?
以下兩行代碼依次執行:
this.dataWriter.WriteBytes(message.MessageBuffer);
await this.dataWriter.StoreAsync();
盡管WriteBytes
調用完成無異常,但它下方的StoreAsync
調用卻StoreAsync
ObjectDisposedException
轟炸,並說
該對象已被關閉。 (來自HRESULT的異常:0x80000013)
this.DataWriter
( Windows.Storage.Streams.DataWriter )不為null,那究竟是什么說“關閉?”
編輯
僅針對如何創建對象的進一步上下文
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);
}
}
我沒有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
無關。 與處理的東西很少有關系,因此我們將其設為null,但這不是必需的。
我會檢查一下你要傳遞給構造函數的流,然后查找可能正在處理它的那個流的任何引用(通過像我在這里展示的using
塊,或者顯式調用stream.Dispose()
)。
有一個無限的線組合來拋出它,你所擁有的東西不太可能像我在這里說的那樣簡單(它可能分散在構造函數和方法中,並與不相關的代碼混合在一起)。 但我幾乎可以保證它就像這種模式。
只是因為它聽起來有些分歧,所以這里的問題是很難判斷是否有東西被處理掉而沒有告訴它做某事。
因為DataWriter
本質上是緩存操作,所以在調用StoreAsync()
之前,它不會與底層流進行StoreAsync()
。 這就是為什么WriteBytes
也不是異步的原因。 您可以想象一個實現只是將它們固定到List<byte>
(當然,它會比它復雜得多)。
但是當你調用StoreAsync()
方法時,它會StoreAsync()
流並說“寫下我已緩存的東西”。 流嘗試,但它已經關閉,所以它拋出該異常。
這就是為什么它不會拋出第一行,而是在第二行。 而且,與DataWriter
本身的處理相比,為什么我會猜測這是一個被處理的流。
根據您的編輯和評論,您的信息流來自事件參數。
我的猜測是事件調用者正在關閉流,否則套接字將被遠程客戶端關閉(可能是由於超時?)。 我不知道是否有正確的方法來保持該流,如果它是前者。 但那可能是你應該花時間研究的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.