处理在使用语句中发生的异常(iDisposable)



我正在使用datawriter和datareader接口。这些类具有实现的IDISPOSOBOSING界面,因此我将它们包装在using关键字上:

using(var datareader = new DataReader(SerialPortInputStream))
{
CancellationTokenSource cancellation = new CancellationTokenSource();
//Timeout
cancellation.CancelAfter(1000);
//...
datareader.LoadAsync(120).AsTask(cancellation.Token);
//Some fancy methods
...
//Last step: Detach the InputStream to use it again
datareader.DetachStream();
}

此线程在这里说,如果一个例外(此处发生"TaskCancelledException"在使用语句中发生,则该对象被处置。现在,问题与UWP-DataReaderDataWriter:如果对象获取,它们将关闭基础流。处置。为了防止我致电datareader.detachstream(),然后处置。

当我们需要下面的InputStream/outputStream时,我们无法将DataReader/DataWriter与using语句一起使用。这个结论是否正确,还是还有其他方法可以处理这种情况?

using的全部含义是确保对象在块的末尾处置,无论发生什么情况,就不必自己编写所有代码。这是通过将对象放置在finally块中来完成的。

您要做的是在之前调用 datareader.DetachStream() 对象被处置 - 再次,无论发生什么情况

所以我的结论是,using语句在这里不是很有帮助,您应该自己做,也许是这样:

DataReader datareader = null;
try
{
    datareader = new DataReader(SerialPortInputStream);
    CancellationTokenSource cancellation = new CancellationTokenSource();
    //Timeout
    cancellation.CancelAfter(1000);
    //...
    datareader.LoadAsync(120).AsTask(cancellation.Token);
    //Some fancy methods
    ...
}
finally
{
    //Last step: Detach the InputStream to use it again
    datareader?.DetachStream();
    datareader?.Dispose();
}

因此,这本质上是using语句对您的代码所做的,但您可以插入datareader?.DetachStream()调用。


NOTE 即使没有using语句,datareader最终也会被处置。当剩下此变量的范围时,垃圾收集可以随时决定从内存中删除此实例,这将导致对其Dispose方法的调用。因此,在离开范围之前需要打电话给DetachStream()

最新更新