Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CreateFolderAsync期间引发System.InvalidOperationException_C#_Windows 8_Microsoft Metro - Fatal编程技术网

C# CreateFolderAsync期间引发System.InvalidOperationException

C# CreateFolderAsync期间引发System.InvalidOperationException,c#,windows-8,microsoft-metro,C#,Windows 8,Microsoft Metro,我想在我的构造函数中获得一个文件夹。所以,我需要一个非异步方法 public static Windows.Storage.StorageFolder getStorageImagesDir() { Windows.Storage.StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder.CreateFolderAsync("images", CreationCollisi

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

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

        return folder;
    }
但是,如果文件夹第一次不存在,则会抛出
System.invalidoOperationException
。(不知何故,文件夹仍然被创建,甚至引发了异常)

当文件夹已经存在时,该函数工作正常

我能知道我的密码有什么问题吗


在Desktop.NET、Java、Python。。。我们可以执行文件夹创建,只需一行简单的API调用。例如,.NET中的
Directory.CreateDirectory
,Java中的
File.mkdirs
。。。那个么,为什么在Windows应用商店应用程序中,我们需要以异步方式进行操作呢?这难道不会使简单的事情变得不必要和复杂吗?

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

您有两个选择:

  • 您可以创建一个异步方法,并在该方法中等待调用get async进行初始化,或者
  • 您可以将文件夹代码移出构造函数,并提供一些显式初始化

  • 无论哪种方式,对文件夹的唯一有效引用都是等待异步操作。否则,它将在操作完成之前返回。

    从MSDN中的某人处获取代码

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

    我可以知道为什么
    GetResults
    调用会产生
    System.InvalidOperationException
    ?我认为GetResults的意思是“等到文件夹创建完成,然后将文件夹作为结果返回给调用者”?为什么我们不能有一个简单的表单
    Directory.CreateDirectory
    ?在我个人看来,创建异步目录是不必要的。这使得事情变得不必要,因为磁盘IO操作非常适合异步编程。众所周知,磁盘访问速度非常慢,可能会受到许多其他进程的影响。如果有一个后台进程正在将磁盘的使用率推到100%,并且在接下来的五分钟内会这样做(我想到的是视频处理),该怎么办。在创建文件夹之前,你的应用程序是否应该完全停止五分钟?@JohnKoerner-Ya。我明白你的意思。理论上是这样。但实际上,创建一个文件夹是否需要5分钟?如果有,用户将责怪硬件,而不是软件。:)我真正想说的是,微软应该同时提供异步和非aysnc的I/O功能。我们,开发人员,很聪明,可以在两者之间做出选择。@YanChengCHEOK微软在完整的框架中做到了这一点,他们发现(我必须找到白皮书),人们坚持使用同步方法几乎完全是因为它更容易编程。这会对某些应用程序产生不利影响,因此他们决定完全异步,让程序员为其工作。