#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
должен возвращать aTask<bool>
, как заметил Хайтам, иUploadBtnExecute
долженasync void
(это какой-то обработчик событий, верно?)5. если функция есть
async Task<bool>
, вы можете просто вернутьсяtrue
, C # async / await magic превратит это в aTask<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);
}