4

我的代码到底有什么问题?

    private void BrowseButton_Click(object sender, RoutedEventArgs e)
    {
        FileOpenPicker FilePicker = new FileOpenPicker();
        FilePicker.FileTypeFilter.Add(".exe");
        FilePicker.ViewMode = PickerViewMode.List;
        FilePicker.SuggestedStartLocation = PickerLocationId.Desktop;
        // IF I PUT AWAIT HERE   V     I GET ANOTHER ERROR¹
        StorageFile file = FilePicker.PickSingleFileAsync();
        if (file != null)
        {
            AppPath.Text = file.Name;
        }
        else
        {
            AppPath.Text = "";
        }         
    }

它给了我这个错误:

无法将类型“Windows.Foundation.IAsyncOperation”隐式转换为“Windows.Storage.StorageFile”

如果我添加“等待”,就像对代码的评论一样,我会收到以下错误:

¹ 'await' 运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法并将其返回类型更改为“任务”。

代码源在这里

4

1 回答 1

5

好吧,编译器错误消息非常直接地解释了您的代码无法编译的原因。FileOpenPicker.PickSingleFileAsync返回IAsyncOperation<StorageFile>- 所以不,您不能将该返回值分配给StorageFile变量。IAsyncOperation<>在 C#中使用的典型方式是使用await.

您只能awaitasync方法中使用......所以您可能希望将方法更改为异步:

private async void BrowseButton_Click(object sender, RoutedEventArgs e)
{
    ...
    StorageFile file = await FilePicker.PickSingleFileAsync();
    ...
}

请注意,对于事件处理程序以外的任何事情,最好让异步方法返回Task而不是void- 使用能力void实际上只是为了您可以将异步方法用作事件处理程序。

如果您还不太熟悉async/ await,那么您可能应该在继续之前阅读它 - MSDN“异步编程与异步和等待”页面可能是一个不错的起点。

于 2013-05-12T21:48:06.780 回答