在我的Windows 8应用程序中有一个全局类,其中有一些静态属性,如:
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();
}
}
}
您可以看到我想在项目的其他位置使用应用程序根文件夹,因此我将其设为静态属性。在getter中,我需要确保根文件夹存在,否则创建它。但是CreateFolderAsync
是异步方法,这里我需要一个同步操作。我尝试GetResults()
,但它会抛出InvalidOperationException
。什么是正确的实施? (package.appmanifest已正确配置,实际创建了该文件夹。)
答案 0 :(得分:15)
我建议您使用asynchronous lazy initialization。
public static readonly AsyncLazy<StorageFolder> AppRootFolder =
new AsyncLazy<StorageFolder>(() =>
{
return KnownFolders.DocumentsLibrary
.CreateFolderAsync("theApp", CreationCollisionOption.OpenIfExists)
.AsTask();
});
然后您可以直接await
:
var rootFolder = await EnvironmentEx.AppRootFolder;
答案 1 :(得分:8)
良好的解决方案: 不要做财产。制作异步方法。
“嘿伙计们,我讨厌等待,我怎么能让一切变得同步?”溶液强> How to call asynchronous method from synchronous method in C#?
答案 2 :(得分:4)
使用await关键字
public async static StorageFolder GetAppRootFolder()
{
return await ApplicationData
.LocalFolder
.CreateFolderAsync("folderName");
}
并在您的代码中
var myRootFolder = await StaticClass.GetAppRootFolder(); // this is a synchronous call as we are calling await immediately and will return the StorageFolder.
答案 3 :(得分:0)
这是一个想法。
public Task<int> Prop {
get
{
Func<Task<int>> f = async () =>
{
await Task.Delay(1000); return 0;
};
return f();
}
}
private async void Test()
{
await this.Prop;
}
但它为每次调用创建一个新的Func对象 这会做同样的
public Task<int> Prop {
get
{
return Task.Delay(1000).ContinueWith((task)=>0);
}
}
由于不允许await a.Prop = 1;