Reputation: 2301
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?
Upvotes: 46
Views: 129165
Reputation: 34189
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.
Upvotes: 74
Reputation: 892
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.
Upvotes: 6
Reputation: 4835
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
Upvotes: 8