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 avoid
method, and therefore its result cannot be assigned to a variable.You can use
.Result
which will wait untilTask
completes and return a 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.
It will not block the thread and enable asynchronous behavior.