Как получить результат 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.

// 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 вместо .Результат.