【问题标题】:Handle Exception that happens within a using statement (IDisposable)处理在 using 语句中发生的异常 (IDisposable)
【发布时间】:2016-10-24 19:05:18
【问题描述】:

我正在使用DataWriter and DataReader 接口。 这些类实现了 IDisposable 接口,因此我将它们包装在 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();
}

这个线程 here 是说如果一个异常(这里是一个 "TaskCancelledException" 在 using 语句中发生,该对象将被释放。现在,问题在于 UWP-DataReaderDataWriter:他们将如果对象被释放,则关闭底层流。为了防止这种情况我必须调用 datareader.DetachStream() 然后释放。

当我们稍后再次需要底层 InputStream/Outputstream 时,我们不能将 DataReader/DataWriter 与 using 语句一起使用。 这个结论是正确的还是有其他方法可以处理这种情况?

【问题讨论】:

    标签: c# windows-runtime uwp datareader


    【解决方案1】:

    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() 调用。


    注意,即使没有 using 语句,datareader 最终也会被处理掉。当这个变量的作用域离开时,垃圾收集可能随时决定从内存中删除这个实例,这将导致调用它的Dispose 方法。所以在离开作用域之前需要调用DetachStream()

    【讨论】:

    • (关于你的笔记:)我学得很辛苦。特别是当您必须再次使用流时:“突然”垃圾收集器将关闭流并“破坏”您的其他方法:无论发生什么,始终调用DetachStream()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    相关资源
    最近更新 更多