Ошибка асинхронного ожидания задачи для загрузки файлов в WPF

#c# #wpf

#c# #wpf

Вопрос:

Я пытаюсь выполнить асинхронную операцию в методе UploadBtnExecute.Я работаю над этим в wpf. Но это показывает некоторую ошибку.

ошибка: — ошибка 1:: — ‘

Задача UploadBtnExecute(object)’ имеет неправильный возвращаемый тип

ошибка 2 ::- ‘

bool’ не содержит определения для ‘GetAwaiter’, и не удалось найти доступный метод расширения ‘GetAwaiter’, принимающий первый аргумент типа ‘bool’ (вам не хватает директивы using или ссылки на сборку?)

Что я пробовал:

событие нажатия кнопки для запуска функции

 UploadBtnClick = new RelayCommands(UploadBtnExecute,UploadBtnCanExecuteUpload);

public async Task UploadBtnExecute(object param)
{
    Progress windowShow = new Progress();
    windowShow.Show();
    await UploadFiles();
    windowShow.Hide();
}

public bool UploadFiles(List<Item> selectedFiles)
{
    //do some upload code here
    return true;
}
 

Комментарии:

1. UploadFiles необходимо вернуться Task<bool> , чтобы вы могли ожидать его выше

2. добавлена задача возврата <bool> в методе загрузки без изменений

3. добавлено как общедоступная асинхронная задача<bool> UploadBtnExecute(параметр объекта)

4. смотрите мой ответ. UploadFiles должен возвращать a Task<bool> , как заметил Хайтам, и UploadBtnExecute должен async void (это какой-то обработчик событий, верно?)

5. если функция есть async Task<bool> , вы можете просто вернуться true , C # async / await magic превратит это в a Task<bool> автоматически. Если функция не является асинхронной, то вы можете return Task.FromResult(true) правильно вернуть Task<bool> тип, соответствующий вашему оригиналу return true .

Ответ №1:

Ошибка 1:

Должен вернуться обработчик события void . Это тот случай, когда рекомендуется использовать async void вместо использования async Task (главным образом потому, что на самом деле альтернативы нет) для асинхронной функции, которая не возвращает значение.

Ошибка 2:

Ваш второй UploadFiles должен возвращать a Task<bool> вместо bool for await , чтобы иметь какой-либо смысл.

Кроме того, поскольку эта функция фактически выполняет что-то асинхронное, вы, вероятно, ждете ее async Task<bool> и используете await в реальном коде, который что-то загружает, но это может зависеть от вашей фактической цели.

Итак, в качестве резюме, ваш фрагмент кода должен быть адаптирован следующим образом:

 UploadBtnClick = new RelayCommands(UploadBtnExecute,UploadBtnCanExecuteUpload);

public async void UploadBtnExecute(object param)
{
    Progress windowShow = new Progress();
    windowShow.Show();
    await UploadFiles();
    windowShow.Hide();
}

public async Task<bool> UploadFiles(List<Item> selectedFiles)
{
    // do some upload code here
    // using await ....
    return true;
}

// alternatively:
public Task<bool> UploadFiles(List<Item> selectedFiles)
{
    // do some upload code here
    return Task.FromResult(true);
}