C# – How to get bool result from async task function in C# – Error: Cannot implicitly convert type `void’ to `bool’

asynchronousc

I have created task function for validating my json file. Everything works fine until I didn't use the result. When I am trying to get the result from async task<bool> function it is showing error as Cannot implicitly convert 'void' to bool. My async function is as follows:

 private async Task<bool> MyValidationFunction(string json)
 {
     bool isValid = true;
     .......DOING MY VALIDATION STUFF.....
     return isValid;
 }

Calling this function from another function is as follows:

 public bool GetJsonAndValidate()
 {
      bool isValid = true;
      string jsonData = GetJson();
      //******* Here I am getting the error.
      bool isValid = MyValidationFunction(jsonData).Wait(); 
 }

When I am trying to call MyValidationFunction it is showing error as mention above. I have tried to get result by using Result property but it is throwing and error. My Class is just simple public class. I can do it with synchronous call but I need to have asynchronous call as MyValidationFunction get the result from database. If I didn't use the bool variable to capture the result, then it works fine. What I have missed out? How can I get bool result from my validation function?

Best Answer

Statement 1. .Wait() has no return result. It is a void method, and therefore its result cannot be assigned to a variable.
You can use .Result which will wait until Task completes and return a result.

// 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;

However, it is all valid for usual Tasks, but not for async/await functionality, because...

Statement 2. Do not mix up async and .Wait() - it still blocks the thread, killing the idea of async/await and negating all the performance improvement.

It also causes deadlock in WinForms, WPF, ASP.NET and other environments with SynchronizationContext. Read more about it in this Stephen Cleary's article or in these StackOverflow questions:

Simple rule: if you use async, then you use await.

// That's how you do it with async/await:
public async bool GetJsonAndValidate()
{
     string jsonData = GetJson();
     bool isValid = await MyValidationFunction(jsonData); 
}

It will not block the thread and enable asynchronous behavior.

Related Topic