简体   繁体   中英

How to get bool result from async task<bool> function in C# - Error: Cannot implicitly convert type `void' to `bool'

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?

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.

Change this:

bool isValid = MyValidationFunction(jsonData).Wait(); 

to

  bool isValid = MyValidationFunction(jsonData).Result; 

Task.Wait's return type is void . Task.Result does a wait and fetches the result from the task.

Not related to OP's question, but its bad idea to mix async and Wait(or Result). You may get weird hangs in your application because of deadlocks if your application depends on a SynchronizationContext

I've been working with async methods and always used it this way :

bool isValid = await MyValidationFunction(jsonData);

I saw the provided answers.

Sometimes .Result dies. So, i would suggest you to use await instead of .Result.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM