Что, черт возьми, не так с моим кодом?

    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 можно использовать только в асинхронном методе. Подумайте о том, чтобы пометить этот метод модификатором async и изменить его возвращаемый тип на Task.

Источник кода здесь

4
gabrieljcs 13 Май 2013 в 01:43

1 ответ

Лучший ответ

Что ж, причина того, что ваш код не компилируется, довольно прямо объясняется сообщением об ошибке компилятора. FileOpenPicker.PickSingleFileAsync возвращает IAsyncOperation<StorageFile> - так что нет, вы не можете присвоить это возвращаемое значение переменной StorageFile. Типичный способ использования IAsyncOperation<> в C # - await.

Вы можете использовать только await в методах async ... так что вы, вероятно, захотите изменить свой метод на асинхронный:

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

Обратите внимание, что для чего-либо, кроме обработчиков событий, лучше сделать так, чтобы асинхронный метод возвращал Task, а не void - возможность использовать void действительно только для того, чтобы вы могли используйте асинхронный метод в качестве обработчика событий.

Если вы еще не совсем знакомы с async / await, вам, вероятно, следует прочитать об этом, прежде чем идти дальше - Страница MSDN" Асинхронное программирование с помощью async и await ", вероятно, является хорошей отправной точкой.

5
Jon Skeet 13 Май 2013 в 02:03
Теперь я понял, большое спасибо! Я начинаю изучать C #, и этот материал async / await для меня действительно в новинку. Ваша помощь очень ценится!
 – 
gabrieljcs
13 Май 2013 в 02:16