7

在我的 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 配置正确,文件夹实际上是创建的。)

4

4 回答 4

16

我建议你使用异步延迟初始化

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

然后你可以await直接:

var rootFolder = await EnvironmentEx.AppRootFolder;
于 2012-09-12T12:45:54.723 回答
13

好的解决方案: 不要制造财产。制作一个异步方法。

“我讨厌等待,我怎样才能让一切都同步?” 解决方案:如何在 C# 中从同步方法调用异步方法?

于 2012-09-12T08:46:54.613 回答
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.
于 2012-09-12T08:55:41.363 回答
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;不允许

于 2016-05-13T13:22:18.457 回答