2017-11-18 1 views
0

Ich muss eine Datenbank erstellen/überprüfen Sie für meine Existenz bei meinem Programmstart.ApplicationData.Current.LocalFolder GetFile synchrone

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) 

Meine Anwendung kann und sollte nicht ausgeführt werden, bevor dieser Test abgeschlossen wurde.

Daher wollte ich meine Anrufe ändern, um synchron zu sein.

Allerdings sehe ich nur

ApplicationData.Current.LocalFolder.GetFileAsync 

.GetFile existiert nicht.

Was wäre der Weg, um den Anruf synchron zu machen?

+0

Ich glaube, der richtige Weg, um dies zu handhaben ist zu erwarten auf diese Methode von seiner Aufrufmethode. Und vor diesem Einsatz warten Sie auf die aufrufende Methode ebenso wie auf die gesamte Scope-Kette, bis Sie von einem Konstruktor aufrufen. Oder verwenden Sie eine "async void" -Methode, um sie aufzurufen, wenn Sie müssen, was sie synchron ausführt. [link] https://msdn.microsoft.com/en-us/magazine/jj991977.aspx –

Antwort

1

Es gibt kein Problem mit Async.

Wenn Sie alles tun async, zum Beispiel

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

    return; 
} 

Dann können Sie sicher sein, dass SomethingB() wird nie vor SomethingA() aufgerufen werden ist erwartet worden.

Das ist der Grund, warum Sie alles Async tun müssen, wenn Sie etwas Asynchron in einer Subroutine tun.

1

Sie können die .NET-APIs von System.IO verwenden, um Dateien synchron zu lesen. Sie können die StorageFolder.Path-Eigenschaft von LocalFolder abrufen und den Pfadnamen an .NET übergeben.

Die FileStream constructor nimmt eine path und eine mode und von dort können Sie synchron oder asynchron lesen und schreiben.

+0

Ich denke, ich habe das schon versucht. Könnten Sie den entsprechenden Code für "ApplicationData.Current.LocalFolder.GetFileAsync (dbPath);" – tmighty