Question: 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?

Answer: 
**Statement 1.** [`.Wait()`](https://msdn.microsoft.com/en-us/library/dd235635(v=vs.110).aspx) has no return result. It is a `void` method, and therefore its *result* cannot be assigned to a variable.  

You can use [`.Result`](https://msdn.microsoft.com/en-us/library/dd321468(v=vs.110).aspx) 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()`](https://msdn.microsoft.com/en-us/library/dd235635(v=vs.110).aspx) - 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](http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html) or in these StackOverflow questions:

* [An async/await example that causes a deadlock](https://stackoverflow.com/questions/15021304/an-async-await-example-that-causes-a-deadlock)
* [await works but calling task.Result hangs/deadlocks](https://stackoverflow.com/questions/17248680/await-works-but-calling-task-result-hangs-deadlocks)

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