CreateFolderAsync期间抛出System.InvalidOperationException

时间:2012-11-28 10:03:25

标签: c# windows-8 microsoft-metro

我想在构造函数中获取一个文件夹。所以,我需要一种非异步方法。

    public static Windows.Storage.StorageFolder getStorageImagesDir()
    {
        Windows.Storage.StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder.CreateFolderAsync("images", CreationCollisionOption.OpenIfExists).GetResults();

        return folder;
    }

但是,如果该文件夹第一次不存在,则抛出System.InvalidOperationException。 (不知何故,文件夹仍然被创建,甚至抛出异常)

当文件夹已存在时,该功能正常。

我的代码可能有问题吗?

在Desktop .NET,Java,Python ......中,我们可以通过一个简单的单线API调用来执行文件夹创建。例如,.NET中的Directory.CreateDirectory,Java中的File.mkdirs,...那么,为什么在Windows应用商店应用中,我们需要以异步方式执行此操作?是不是简单的事情变得多么复杂?

2 个答案:

答案 0 :(得分:2)

从MSDN中的某人那里获取代码。

StorageFolder folder = ApplicationData.Current.LocalFolder.CreateFolderAsync("images", CreationCollisionOption.OpenIfExists)
                               .AsTask()
                               .Result;
return folder;

答案 1 :(得分:0)

问题是您正在尝试在构造函数中执行异步操作。构造函数本身不是异步的,因此您可能在实际创建文件夹之前尝试运行操作(GetResults)。

您有两种选择:

  1. 您可以创建一个异步方法,并在该方法中等待调用以获取初始化的异步,或者
  2. 您可以将文件夹代码移出构造函数并提供一些显式初始化。
  3. 无论哪种方式,对于您将获得的文件夹的唯一有效引用是等待异步操作。否则它将在操作完成之前返回。