DataWriter ObjectDisposedException 是什么意思?
What does DataWriter ObjectDisposedException mean?
下面两行代码一行一行执行:
this.dataWriter.WriteBytes(message.MessageBuffer);
await this.dataWriter.StoreAsync();
虽然 WriteBytes
调用无一例外地完成,但它下面的 StoreAsync
调用却用 ObjectDisposedException
轰炸并说
The object has been closed. (Exception from HRESULT: 0x80000013)
this.DataWriter
(Windows.Storage.Streams.DataWriter) 不为空,所以它到底在说什么 "closed?"
编辑
只是为了进一步了解对象的创建方式
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()
).
有无数行组合可以抛出它,你得到的东西不太可能像我在这里所说的那样简单(它可能分布在构造函数和方法中,并与不相关的代码混合在一起).但我几乎可以保证它是这样的模式。
只是因为听起来有些分歧,这里的问题是它 difficult to tell if something is disposed 没有告诉它做某事。
因为 DataWriter
本质上是缓存操作,所以在您调用 StoreAsync()
之前它不会与底层流对话。这就是为什么 WriteBytes
也不是异步的。您可以想象一个将它们固定到 List<byte>
上的实现(当然,它会比这复杂得多)。
但是当你调用 StoreAsync()
方法时,它会到达流并说 "write this stuff I have cached up." 流尝试,但它已经关闭,所以它抛出异常。
这就是为什么它不在第一行抛出,而是在第二行抛出的原因。以及为什么我冒险猜测这是一个已处置的流,与 DataWriter
本身被处置相比。
根据您的编辑和评论,您的流来自事件参数。
我的猜测是流正在被事件调用者关闭,或者套接字正在被远程客户端关闭(可能是由于超时?)。我不知道是否有正确的方法来保留该流,如果是前者。但这可能是您应该投入研究时间的地方。
下面两行代码一行一行执行:
this.dataWriter.WriteBytes(message.MessageBuffer);
await this.dataWriter.StoreAsync();
虽然 WriteBytes
调用无一例外地完成,但它下面的 StoreAsync
调用却用 ObjectDisposedException
轰炸并说
The object has been closed. (Exception from HRESULT: 0x80000013)
this.DataWriter
(Windows.Storage.Streams.DataWriter) 不为空,所以它到底在说什么 "closed?"
编辑
只是为了进一步了解对象的创建方式
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()
).
有无数行组合可以抛出它,你得到的东西不太可能像我在这里所说的那样简单(它可能分布在构造函数和方法中,并与不相关的代码混合在一起).但我几乎可以保证它是这样的模式。
只是因为听起来有些分歧,这里的问题是它 difficult to tell if something is disposed 没有告诉它做某事。
因为 DataWriter
本质上是缓存操作,所以在您调用 StoreAsync()
之前它不会与底层流对话。这就是为什么 WriteBytes
也不是异步的。您可以想象一个将它们固定到 List<byte>
上的实现(当然,它会比这复杂得多)。
但是当你调用 StoreAsync()
方法时,它会到达流并说 "write this stuff I have cached up." 流尝试,但它已经关闭,所以它抛出异常。
这就是为什么它不在第一行抛出,而是在第二行抛出的原因。以及为什么我冒险猜测这是一个已处置的流,与 DataWriter
本身被处置相比。
根据您的编辑和评论,您的流来自事件参数。
我的猜测是流正在被事件调用者关闭,或者套接字正在被远程客户端关闭(可能是由于超时?)。我不知道是否有正确的方法来保留该流,如果是前者。但这可能是您应该投入研究时间的地方。