编程语言
首页 > 编程语言> > 首页> C#> DataWriter的ObjectDisposedException是什么意思?

首页> C#> DataWriter的ObjectDisposedException是什么意思?

作者:互联网

以下两行代码在另一行之后立即执行:

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)不为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无关.处理的东西很少有关系,因此我们将其设为null,但这不是必需的.

我会四处查看,看看要传递给构造函数的流是什么,然后查找对该流有可能对其进行处置的任何引用(通过如我在此处所示的using块或对stream的显式调用). ()).

有无数行将其抛出,并且您获得的内容不可能像我在这里说的那么简单(它可能散布在构造函数和方法中,并与不相关的代码混合在一起).但我实际上会保证它是这种模式.

就像听起来有些分歧一样,这里的问题是difficult to tell if something is disposed却没有告诉它做点什么.

因为DataWriter本质上是在缓存操作,所以在调用StoreAsync()之前,它不会与基础流进行对话.这就是为什么WriteBytes也不会异步的原因.您可以想象一个将它们固定到List< byte>中的实现. (当然,要比这复杂得多).

但是,当您调用StoreAsync()方法时,它会伸向流并显示“写出我已缓存的内容”.流会尝试,但已经关闭,因此会引发该异常.

这就是为什么它不会在第一行上抛出而在第二行上抛出的原因.以及为什么要冒这样一个猜测:与DataWriter本身相比,这是一个已废弃的流.

根据您的编辑和评论,您的流来自事件args.

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

标签:windows-store-apps,c
来源: https://codeday.me/bug/20191119/2034454.html