0

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>

  1. 如何确保 DataWriter 缓冲区中的字节被存储?我认为在 finally 块中调用 StoreAsync 会带来麻烦,因为 finally 块中不允许使用“等待”。
  2. 如果我的解决方案可以工作,如何检测数据写入器是否已以线程安全的方式处理?
4

1 回答 1

0

无论如何,您的代码都有问题,因为您需要在StoreAsync()调用之前等待调用Dispose()

在您的代码StoreAsync()中可能会与Dispose().

你需要这样做:

 await dataWriter.StoreAsync();
 dataWriter.Dispose();
于 2012-10-09T07:44:26.973 回答