2012-10-08 63 views
0

System.IO.StreamWriter保證在處理緩衝區時將字節保存在緩衝區中。像這樣WinRT DataWriter如何確保緩衝區中的所有字節都保存到後臺存儲

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. 如果我的解決方案能夠工作,如何檢測數據寫入程序是否以線程安全方式處理?

回答

0

您的代碼在任何情況下都有問題,因爲您需要在致電Dispose()之前等待StoreAsync()呼叫。

在您的代碼StoreAsync()可能會與Dispose()並行執行。

你需要這樣做:

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

是的,這就是我試圖解決另一個問題:「等待」經營者不能在鎖定語句體中使用,也不能在最終使用條款。 – kennyzx

+1

我想你可以做一些事情:dataWriter.StoreAsync()。ContinueWith(()=> dataWriter.Dispose()); – thumbmunkeys

+0

不知道這是否有助於:dataWriter.StoreAsync()。AsTask()。Wait(); –

相關問題