I know that an async
method can only return void
or Task
. I have read similar methods for Exception handling inside async
methods. And I'm new to async
programming so I am looking for a straightforward solution.
My async
method runs an Sql query. If the query was ok, it should notify the caller with a Boolean true
and otherwise a false
. My method is currently a void so I have no way of knowing.
private async void RefreshContacts()
{
Task refresh = Task.Run(() =>
{
try
{
// run the query
}
catch { }
}
);
await refresh;
}
I simply would like to change async
to Task
so that in my catch
statement the method will return a false
and otherwise a true
.
Async methods can have the following return types: Task, for an async method that performs an operation but returns no value. Task<TResult>, for an async method that returns a value. void , for an event handler.
Async functions always return a promise. If the return value of an async function is not explicitly a promise, it will be implicitly wrapped in a promise. Note: Even though the return value of an async function behaves as if it's wrapped in a Promise.resolve , they are not equivalent.
C# Language Async-Await Returning a Task without awaitThere is only one asynchronous call inside the method. The asynchronous call is at the end of the method. Catching/handling exception that may happen within the Task is not necessary.
An await expression in an async method doesn't block the current thread while the awaited task is running. Instead, the expression signs up the rest of the method as a continuation and returns control to the caller of the async method. The async and await keywords don't cause additional threads to be created.
It sounds like you just need to return a Task<bool>
then:
private async Task<bool> RefreshContactsAsync()
{
try
{
...
}
catch // TODO: Catch more specific exceptions
{
return false;
}
...
return true;
}
Personally I would not catch the exception, instead letting the caller check the task for a faulted state, but that's a different matter.
Change the method signature to Task<bool>
. Then if your method is declared as async you can simple return a bool value. But as jon skeet said there are other, possibly better ways, to handle your szenario
private async Task<bool> RefreshContacts()
{
Task refresh = Task.Run(() =>
{
try
{
// run the query
return true;
}
catch { return false;}
}
PS: Another common issue you will possibly have is if you have a method without async. Then you can return Task.FromResult(true)
like this:
private Task<bool> RefreshContacts()
{
....
return Task.FromResult(true)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With