Proprietà asincrona in c #

Nella mia applicazione Windows 8 c’è una class globale dove ci sono alcune proprietà statiche come:

public class EnvironmentEx { public static User CurrentUser { get; set; } //and some other static properties //notice this one public static StorageFolder AppRootFolder { get { return KnownFolders.DocumentsLibrary .CreateFolderAsync("theApp", CreationCollisionOption.OpenIfExists) .GetResults(); } } } 

Puoi vedere che voglio usare la cartella radice dell’applicazione da qualche altra parte nel progetto, quindi la renderò una proprietà statica. All’interno del getter, ho bisogno di assicurarmi che la cartella radice esista, altrimenti crearla. Ma CreateFolderAsync è un metodo asincrono, qui ho bisogno di un’operazione sincronizzata. Ho provato GetResults() ma lancia una InvalidOperationException . Qual è l’implementazione corretta? (Il pacchetto package.appmanifest è configurato correttamente, la cartella viene effettivamente creata.)

Buona soluzione: non creare una proprietà. Crea un metodo asincrono.

“Ehi ragazzi, odio aspettare, come posso rendere tutto sincronico?” soluzione: come chiamare il metodo asincrono dal metodo sincrono in C #?

Suggerisco di utilizzare l’inizializzazione pigra asincrona .

 public static readonly AsyncLazy AppRootFolder = new AsyncLazy(() => { return KnownFolders.DocumentsLibrary .CreateFolderAsync("theApp", CreationCollisionOption.OpenIfExists) .AsTask(); }); 

Puoi quindi await direttamente:

 var rootFolder = await EnvironmentEx.AppRootFolder; 

usa la parola chiave await

  public async static StorageFolder GetAppRootFolder() { return await ApplicationData .LocalFolder .CreateFolderAsync("folderName"); } 

e nel tuo codice

 var myRootFolder = await StaticClass.GetAppRootFolder(); // this is a synchronous call as we are calling await immediately and will return the StorageFolder. 

Ecco un’idea.

 public Task Prop { get { Func> f = async () => { await Task.Delay(1000); return 0; }; return f(); } } private async void Test() { await this.Prop; } 

ma crea un nuovo object Func per ogni chiamata che farebbe lo stesso

 public Task Prop { get { return Task.Delay(1000).ContinueWith((task)=>0); } } 

Non puoi aspettare un set da quando await a.Prop = 1; non è permesso