System.IO.StreamWriter 保证在处理缓冲区时将字节保存在缓冲区中。像这样
using (StreamWriter writer = new StreamWriter("C:\\a.txt"))
{
writer.WriteLine("Hello world.");
}
StreamWriter 的好处是我可以从多个线程调用它的 Dispose 方法,而不必担心数据丢失。
但是对于 Windows.Storage.Streams.DataWriter,我必须显式调用它的 StoreAsync 方法,否则数据不会保存到文件中。问题是,如果 DataWriter 已被释放(从其他线程),调用 StoreAsync 将引发 ObjectDisposedException。所以我必须在调用 StoreAsync 之前检查 DataWriter 是否已经被处理掉了。所以我的代码看起来像
try
{
dataWriter.WriteBytes(buffer);
}
catch(...)
{
//...
}
finally
{
lock (lockForDisposingDataWriter)
{
if (!bDisposed) //Boolean flag indicating whether dataWriter has been disposed of
{
bDisposed = true;
await dataWriter.StoreAsync(); //await operator is not allowed here
dataWriter.Dispose();
}
}
}
问题:</p>
- 如何确保 DataWriter 缓冲区中的字节被存储?我认为在 finally 块中调用 StoreAsync 会带来麻烦,因为 finally 块中不允许使用“等待”。
- 如果我的解决方案可以工作,如何检测数据写入器是否已以线程安全的方式处理?