In my windows 8 application there is a global class where there are a few static properties like:
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();
}
}
}
You can see I want to use the application root folder somewhere else in the project, so I make it a static property. Inside the getter, I need to make sure the root folder exists,otherwise create it. But the CreateFolderAsync
is an async method, here I need a synchronized operation. I tried GetResults()
but it throws an InvalidOperationException
. What is the correct implementation? (The package.appmanifest is correctly configured, the folder is actually created.)
I suggest you use asynchronous lazy initialization.
public static readonly AsyncLazy<StorageFolder> AppRootFolder =
new AsyncLazy<StorageFolder>(() =>
{
return KnownFolders.DocumentsLibrary
.CreateFolderAsync("theApp", CreationCollisionOption.OpenIfExists)
.AsTask();
});
You can then await
it directly:
var rootFolder = await EnvironmentEx.AppRootFolder;
Good solution: Don't make a property. Make an async method.
"I hate await, how can I make everything synchronous?" solution: How to call asynchronous method from synchronous method in C#?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With