Как получить результат bool из функции асинхронной задачи в C# - Error: невозможно неявно преобразовать тип "void" в "bool"
Я создал функцию задачи для проверки моего файла json. Все работает нормально, пока я не использовал результат. Когда я пытаюсь получить результат от async task<bool> function
он показывает ошибку как Cannot implicitly convert 'void' to bool
. Моя асинхронная функция выглядит следующим образом:
private async Task<bool> MyValidationFunction(string json)
{
bool isValid = true;
.......DOING MY VALIDATION STUFF.....
return isValid;
}
вызов этой функции из другой функции выглядит следующим образом:
public bool GetJsonAndValidate()
{
bool isValid = true;
string jsonData = GetJson();
//******* Here I am getting the error.
bool isValid = MyValidationFunction(jsonData).Wait();
}
когда я пытаюсь позвонить MyValidationFunction
он показывает ошибку, как указано выше. Я попытался получить результат, используя Result
свойство, но это бросание и ошибка. Мой класс - просто публичный класс. Я могу сделать это с синхронным вызовом, но мне нужно иметь асинхронный вызов как MyValidationFunction
получить результат из базы данных. Если я не использовал переменную bool для захвата результата, то она работает нормально. Что я упустил? Как я могу получить результат bool из моей функции проверки?
3 ответов
Утверждение 1. .Wait()
не возвращает никакого результата. Это void
метод, и поэтому его результат нельзя назначить переменной.
Вы можете использовать .Result
что будет ждать, пока Task
завершается и возвращает результат.
// Both are applicable to simple Tasks:
bool isValid = MyValidationFunction(jsonData).Result;
// does that same as
var task = MyValidationFunction(jsonData);
task.Wait();
bool isValid = task.Result;
тем не менее, все это действительно для обычные задачи, но не для async/await функциональность, ведь...
заявление 2. не смешивайте до async и .Wait()
- он по-прежнему блокирует поток, убивая идею асинхронности/ожидания и отрицая все улучшения производительности.
это также вызывает взаимоблокировку в WinForms, WPF, ASP.NET и другие среды с SynchronizationContext
.
Подробнее об этом читайте в этом статья Стивена Клири или в этих вопросах StackOverflow:
- пример async / await, который вызывает взаимоблокировку
- ждут работает, но вызывает задачу.Результат висит/тупиков
простое правило: если вы используете async, то вы используете await.
// That's how you do it with async/await:
public async bool GetJsonAndValidate()
{
string jsonData = GetJson();
bool isValid = await MyValidationFunction(jsonData);
}
он не будет блокировать поток и включить асинхронное поведение.
изменить это:
bool isValid = MyValidationFunction(jsonData).Wait();
to
bool isValid = MyValidationFunction(jsonData).Result;
задач.Ждать тип возврата пустота. задач.Результат выполняет ожидание и извлекает результат из задачи.
не связано с вопросом OP, но его плохая идея смешать асинхронные и ждать(или результат). Вы можете получить странные зависания в своем приложении из-за тупиков, если ваше приложение зависит от SynchronizationContext
Я работаю с асинхронными методами и всегда использовал его таким образом :
bool isValid = await MyValidationFunction(jsonData);
Я видел, были даны ответы.
иногда .Результат умирает. Поэтому я бы предложил вам использовать await вместо .Результат.