c# - DataWriter ObjectDisposeException 是什么意思?

标签 c# windows-store-apps

下面两行代码依次执行:

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

尽管 WriteBytes 调用毫无异常地完成,但其正下方的 StoreAsync 调用会抛出 ObjectDisposeException 并显示

The object has been closed. (Exception from 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尽管看一下堆栈跟踪就会告诉您,这甚至会引发异常。

这段代码会导致这个错误,而且这是一个很容易犯的错误:

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

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

处置与 null 没有直接关系。与已处置的东西几乎没有太多关系,因此我们将其设为空,但这不是必要的。

我会检查一下您要传递到构造函数中的流,然后查找可能会处理它的对该流的任何引用(通过像我在这里所示的 using block ,或者显式调用stream.Dispose())。

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


因为听起来有些分歧,这里的问题是它是 difficult to tell if something is disposed而不告诉它做某事。

因为DataWriter本质上是缓存操作,它不会与底层流通信,直到您调用 StoreAsync() 。这就是为什么WriteBytes也不是异步的。您可以想象一个将它们固定到 List<byte> 的实现。 (当然,尽管情况会复杂得多)。

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

这就是为什么它不会在第一行抛出,但会在第二行抛出。以及为什么我冒险猜测这是一个已处理的流,与 DataWriter 相比本身正在被处置。


根据您的编辑和评论,您的流来自事件参数。

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

关于c# - DataWriter ObjectDisposeException 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34601559/

相关文章:

c# - 在对话框中使用机器人状态访问器

c# - 如何在 .NET Core 中使用 HttpClientHandler 和 HttpClientFactory

c# - 如何在 blazor wasm 项目上启用 blazor United?

c# - 循环显示 5 个图像的动态图 block

xaml - Windows 应用项目不支持类型

c# - 如何在 Windows 应用商店应用程序中获取一个类的所有派生类的自定义属性

c# - Windows 应用商店应用程序上的 Android-SharedPreferences 之类的东西?

c# - 为什么静态构造函数中的异常包装在 TypeInitializationException 中

c# - 使用窗口消息传递在 JAVA 和 C# 之间进行应用程序间通信

c# - 为什么 .NET Core 中缺少 List<T>.ForEach?