23

我正在尝试使用 GetFilesAsync 迭代目录中的所有文件,但是每次调用 GetResults 方法时,它都会抛出一个异常

System.InvalidOperationException:在意外的时间调用了一个方法

代码很简单

var files = myStorageFolder.GetFilesAsync(); //runs fine
var results = files.GetResults(); //throws the exception

我是 Win 8 dev 的新手,所以我可能会遗漏一些明显的东西。

编辑(已解决) 我正在运行我的控制台应用程序,但现在程序运行异步,该files.GetResult()方法不再存在。

static void Main(string[] args)
{
   var files = GetFiles(myStorageFolder);
   var results = files.GetAwaiter().GetResults();//Need to add GetAwaiter()
}

static async Task GetFiles(StorageFolder sf)
{
   await sf.GetFilesAsync();
}
4

4 回答 4

39

如果您不想使用async关键字(在我的情况下,代码在属性内,所以async不是一个选项),您可以使用 aTaskAwaiter代替,通过链接这两个方法:

var folder = Package.Current.InstalledLocation.GetFolderAsync("folderName").GetAwaiter().GetResult();

这不会抛出InvalidOperationException也不会导致死锁。

于 2013-09-21T16:23:27.417 回答
13

您需要等待异步方法完成。因此,您可以使用新的 await 作为一种选择:

var files = await myStorageFolder.GetFilesAsync();

您可能想在此处查看有关处理异步方法的文档。

于 2012-10-27T01:31:26.620 回答
1

您应该await这样做,var files = myStorageFolder.GetFilesAsync();因为当您执行下一条指令时操作可能仍在运行var results = files.GetResults(); //throws the exception

var files = await myStorageFolder.GetFilesAsync(); //runs fine
var results = files.GetResults(); //this will run when call above returns
于 2012-10-27T01:31:44.717 回答
0

如果您使用的是 Windows.Foundation.IAsyncOperation 之类的 Task 的变体,则代码可能如下所示:

var file = StorageFile.GetFileFromPathAsync(protocolArgs.Uri.LocalPath).AsTask().Result;
于 2020-10-25T22:02:34.633 回答