2017-11-18 62 views
0

我需要在我的程序啓動時創建一個數據庫/檢查它的存在。ApplicationData.Current.LocalFolder GetFile同步

public async Task CopyDatabaseIfNotExists(string dbPath) 
{ 
    var nExpectedFolder = IsolatedStorageFile.GetUserStoreForApplication(); 

      try 
      { 
       await ApplicationData.Current.LocalFolder.GetFileAsync(dbPath); //nExpectedFolder.GetFileAsync(dbPath);/// ApplicationData.Current.LocalFolder.GetFileAsync("preinstalledDB.db"); 
       // No exception means it exists 
       return; 
      } 
      catch (System.IO.FileNotFoundException) 
      { 
       // The file obviously doesn't exist 
      } 

     (... some other stuff) 

我的應用程序不能也不應該在測試完成之前運行。

因此,我想改變我的呼叫是同步的。

不過,我只看到

ApplicationData.Current.LocalFolder.GetFileAsync 

.GetFile不存在。

什麼樣的方式使呼叫同步?

+0

我相信處理這個問題的正確方法是從其調用方法使用此方法await。在使用調用方法之前,一直在調用範圍鏈,直到你從構造函數調用。或者使用「異步無效」方法來調用它,如果你必須同步運行它。 [link] https://msdn.microsoft.com/en-us/magazine/jj991977.aspx –

回答

1

async沒有問題。

如果你做的一切異步,例如

private async void DoThis() 
{ 
    await SomethingA(); 
    await SomethingB(); 

    return; 
} 

然後,你可以肯定的是SomethingB()將永遠不會SomethingA之前被稱爲()已經期待已久。

這就是爲什麼你必須在子例程中做一些異步操作時要做所有的異步操作。

1

您可以使用System.IO的.NET API來同步讀取文件。您可以從LocalFolder獲取StorageFolder.Path屬性,並將路徑名稱傳遞給.NET。

FileStream constructor需要pathmode,從那裏你可以同步或異步讀寫。

+0

我想我已經試過了。您可以發佈「ApplicationData.Current.LocalFolder.GetFileAsync(dbPath);」的等效代碼嗎? – tmighty