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();
         }
     }
}

プロジェクトの別の場所でアプリケーション ルート フォルダーを使用したいので、それを静的プロパティにします。ゲッター内で、ルート フォルダーが存在することを確認する必要があります。存在しない場合は作成します。しかし、これ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 に答える