c#中的异步属性

时间:2012-09-12 08:43:39

标签: c# .net asynchronous async-await

在我的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 个答案:

答案 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;

,因此无法等待集合