我正在使用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-DataReader
和DataWriter
:如果对象获取,它们将关闭基础流。处置。为了防止我致电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()
。