Sé que un método async
solo puede devolver void
o Task
. He leído métodos similares para el manejo de excepciones dentro de los métodos async
. Y soy nuevo en la programación async
, así que estoy buscando una solución sencilla.
Mi método async
ejecuta una consulta Sql. Si la consulta fue correcta, debe notificar a la persona que llama con un booleano true
y, de lo contrario, un false
. Mi método es actualmente un vacío, así que no tengo forma de saberlo.
private async void RefreshContacts() { Task refresh = Task.Run(() => { try { // run the query } catch { } } ); await refresh; }
Simplemente me gustaría cambiar async
a Task
para que en mi instrucción catch
el método devuelva un false
y, de lo contrario, un true
.
Parece que solo necesita devolver una Task<bool>
y luego:
private async Task<bool> RefreshContactsAsync() { try { ... } catch // TODO: Catch more specific exceptions { return false; } ... return true; }
Personalmente, no detectaría la excepción, sino que permitiría que la persona que llama verifique la tarea en busca de un estado defectuoso, pero eso es un asunto diferente.
Cambie la firma del método a Task<bool>
. Luego, si su método se declara como asíncrono, puede simplemente devolver un valor bool. Pero como dijo jon skeet, hay otras formas, posiblemente mejores, de manejar su escenario
private async Task<bool> RefreshContacts() { Task refresh = Task.Run(() => { try { // run the query return true; } catch { return false;} }
PD: Otro problema común que posiblemente tendrá es si tiene un método sin sincronización. Luego puede devolver Task.FromResult(true)
así:
private Task<bool> RefreshContacts() { .... return Task.FromResult(true) }
Lo siento, pero creo que están engañando a la gente aquí. Consulte el artículo de Microsoft, aquí .
Ejemplo muy simple que muestra cómo podemos devolver un valor (escalar) de tipo bool
, int
o string
desde una tarea.
Estoy publicando el código C# aquí, para la posteridad:
using System; using System.Linq; using System.Threading.Tasks; public class Example { public static void Main() { Console.WriteLine(ShowTodaysInfo().Result); } private static async Task<string> ShowTodaysInfo() { string ret = $"Today is {DateTime.Today:D}\n" + "Today's hours of leisure: " + $"{await GetLeisureHours()}"; return ret; } static async Task<int> GetLeisureHours() { // Task.FromResult is a placeholder for actual work that returns a string. var today = await Task.FromResult<string>(DateTime.Now.DayOfWeek.ToString()); // The method then can process the result in some way. int leisureHours; if (today.First() == 'S') leisureHours = 16; else leisureHours = 5; return leisureHours; } } // The example displays output like the following: // Today is Wednesday, May 24, 2017 // Today's hours of leisure: 5 // </Snippet >