C# DataWriter ObjectDisposedException是什么意思?

C# DataWriter ObjectDisposedException是什么意思?,c#,windows-store-apps,C#,Windows Store Apps,以下两行代码依次执行: this.dataWriter.WriteBytes(message.MessageBuffer); await this.dataWriter.StoreAsync(); 尽管WriteBytes调用毫无例外地完成,但它正下方的StoreAsync调用会弹出一个ObjectDisposedException并显示 对象已关闭。(HRESULT的异常:0x8000013) this.DataWriter(Windows.Storage.Streams.DataWrite

以下两行代码依次执行:

this.dataWriter.WriteBytes(message.MessageBuffer);
await this.dataWriter.StoreAsync();
尽管
WriteBytes
调用毫无例外地完成,但它正下方的
StoreAsync
调用会弹出一个
ObjectDisposedException
并显示

对象已关闭。(HRESULT的异常:0x8000013)


this.DataWriter
(Windows.Storage.Streams.DataWriter)不是空的,那么它到底说什么是“关闭的”

编辑

只是为了进一步了解对象是如何创建的

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
,尽管查看堆栈跟踪会告诉您

此代码会导致此错误,并且很容易出错:

Windows.Storage.Streams.DataWriter dataWriter;
using (var file = File.OpenRead("..."))
{
    dataWriter = new DataWriter(file);
}

dataWriter.WriteBytes(message.MessageBuffer);
await dataWriter.StoreAsync();
处置与
null
没有直接关系。处理的东西很少有什么关系,所以我们将其设为null,但这不是必需的

我会四处检查,看看您要传递给构造函数的流是什么,然后查找可能正在处理它的对该流的任何引用(可以通过我在这里展示的
使用
块,或者显式调用
stream.Dispose()

有无限多行可以抛出它,而且你得到的不太可能像我在这里所说的那样简单(它可能分布在构造函数和方法中,并与不相关的代码混合在一起)。但我几乎可以保证这是一种类似的模式


只是因为听起来有一些分歧,这里的问题是它没有告诉它去做什么

因为
DataWriter
本质上是在缓存操作,所以在调用
StoreAsync()
之前,它不会与底层流通信。这就是为什么
WriteBytes
也不是异步的。您可以想象一个实现,它只是将它们固定在
列表上(当然,这要复杂得多)

但是当您调用
StoreAsync()
方法时,它会向流伸出手来,说“写下我缓存的东西”。流尝试了,但它已经关闭,因此它抛出了该异常

这就是为什么它不会在第一条线上投球,而是在第二条线上投球。为什么我冒昧地猜测这是一个已处理的流,而不是被处理的
数据编写器本身


根据您的编辑和注释,您的流来自事件参数


我的猜测是,流正在被事件调用方关闭,或者套接字正在被远程客户端关闭(可能是由于超时?)。如果是前者,我不知道是否有一种正确的方法来保持这条流。但这可能是你应该投入研究时间的地方。

数据编写器的类型是什么?Windows.Storage.Streams.dataWriter在你的代码中,
dataWriter
的构造函数看起来像什么?您将传递什么?您将获得异常,因为datawriter是一个已处理的对象。但从发布的代码来看,还不清楚它是如何发生的,这是完全正常的。类实现IDisposable,因为它们有一个可一次性使用的私有成员。然后让该类生成异常。调用WriteBytes()时不太可能使用该一次性对象,因为这只会占用内存。Store(),当然可以,现在就开始。添加ICloseTable添加到WinRT的时间非常晚,并且很容易理解现有方法没有额外检查的原因。@cfrozendath是否检查底层流的处理情况?我想不会,在这种情况下,细节是无关紧要的。这就是为什么我跳到我首先说的,而不是显而易见的选择,
DataWriter
本身可以被释放。@MatthewHaugen-writer没有被释放,也不是null,除非你可以拥有一个不是null但被释放的对象。@O.O你可以。Dispose仅仅意味着调用了
Dispose()
,这可以在任何时候发生,就像任何其他方法一样。通常情况下,您希望在以后将其删除,但这不是契约保证。很好,此类中使用data writer的代码从未调用过dispose(并且该成员仅在此类中使用)。我也看不到一种检查它是否被处理的方法。@O.O是的,我认为数据写入程序没有被处理。我认为潜在的趋势是。您是否研究了传递给构造函数的流,以及在整个代码中有哪些引用?