WinRT DataWriter,如何确保缓冲区中的所有字节都保存到后备存储中

时间:2012-10-08 03:47:11

标签: c# windows-runtime idisposable

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();
        }
    }
}

问题:

  1. 如何确保存储DataWriter缓冲区中的字节?我认为在finally块中调用StoreAsync会引起麻烦,因为在finally块中不允许'await'。
  2. 如果我的解决方案可以正常工作,如何检测数据编写器是否以线程安全方式处理?

1 个答案:

答案 0 :(得分:-1)

您的代码在任何情况下都有问题,因为您需要在致电StoreAsync()之前等待Dispose()来电。

在您的代码中StoreAsync()可能会与Dispose()并行执行。

你需要这样做:

 await dataWriter.StoreAsync();
 dataWriter.Dispose();