在意外的时间调用了一个方法

XSL*_*XSL 23 exception local-storage windows-8 windows-runtime winrt-async

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

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

代码很简单

var files = myStorageFolder.GetFilesAsync(); //runs fine
var results = files.GetResults(); //throws the exception
Run Code Online (Sandbox Code Playgroud)

我是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();
}
Run Code Online (Sandbox Code Playgroud)

dca*_*tro 38

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

var folder = Package.Current.InstalledLocation.GetFolderAsync("folderName").GetAwaiter().GetResult();
Run Code Online (Sandbox Code Playgroud)

InvalidOperationException不会引起僵局,也不会造成僵局.

  • 我注意到`GetAwaiter()`在`Task`上,我试图在`IAwaitableOperation`上使用它,所以我不得不调用`AsTask`然后`结果`,该死的`UWP`.谢谢! (4认同)

小智 13

您需要等待异步方法完成.所以你可以使用new await作为一个选项:

var files = await myStorageFolder.GetFilesAsync();
Run Code Online (Sandbox Code Playgroud)

您可能需要在此处查看有关处理异步方法的文档.