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 バッファー内のバイトが確実に格納されるようにするにはどうすればよいですか? 「await」はfinallyブロックでは許可されていないため、finallyブロックでStoreAsyncを呼び出すと問題が発生すると思います。
  2. 私のソリューションが機能する場合、データライターがスレッドセーフな方法で破棄されたかどうかを検出する方法は?
4

1 に答える 1

0

StoreAsync()を呼び出す前に呼び出しを待機する必要があるため、コードにはいずれにしても問題がありますDispose()

あなたのコードStoreAsync()では、 と並行して実行される可能性がありますDispose()

これを行う必要があります:

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