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)
您有两个选择:
无论哪种方式,对文件夹的唯一有效引用都是等待异步操作。否则,它将在操作完成之前返回。从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微软在完整的框架中做到了这一点,他们发现(我必须找到白皮书),人们坚持使用同步方法几乎完全是因为它更容易编程。这会对某些应用程序产生不利影响,因此他们决定完全异步,让程序员为其工作。