2015-07-20 2 views
4

Я знаю, что метод async может возвращать только void или Task. Я прочитал аналогичные методы обработки исключений внутри методов async. И я новичок в программировании async, поэтому я ищу простое решение.Метод Async для возврата true или false в задаче

Мой метод async выполняет запрос Sql. Если запрос был в порядке, он не должен уведомлять вызывающего абонента с Boolean true и в противном случае false. Мой метод в настоящее время является недействительным, поэтому я не знаю.

private async void RefreshContacts() 
{ 
    Task refresh = Task.Run(() => 
    { 
     try 
     { 
      // run the query 
     } 
     catch { } 
    } 
    ); 
    await refresh;   
} 

Я просто хотел бы изменить async к Task так, что в моем catch заявлении метод возвращает false и в противном случае true.

ответ

2

Изменить подпись метода на Task<bool>. Затем, если ваш метод объявлен как асинхронный, вы можете просто вернуть значение bool. Но, как Джон Скит сказал, что есть другие, возможно, более эффективные способы, чтобы справиться с вашей Szenario

private async Task<bool> RefreshContacts() 
    { 
     Task refresh = Task.Run(() => 
     { 
      try 
      { 
       // run the query 
         return true; 
     } 
     catch { return false;}  
} 

PS: Еще одна распространенная проблема у вас, возможно, есть, если у вас есть метод без асинхронном. После этого вы можете вернуться Task.FromResult(true) так:

private Task<bool> RefreshContacts() 
{ 
    .... 
    return Task.FromResult(true) 
} 
+0

Когда я меняю свой улов на 'catch {return false; } 'после изменения моего возвращаемого типа на' Задача 'Я получил это предупреждающее сообщение:« Поскольку этот вызов не ожидается, выполнение текущего метода продолжается до завершения вызова. Рассмотрим применение оператора «ожидание» к результату вызов." – Disasterkid

+0

Это сообщение не имеет ничего общего с выводом catch. Скорее всего, у вас нет асинхронных вызовов в 'try'. В этом случае нет смысла использовать 'async' или Tasks. –

11

Похоже, вам просто нужно вернуть Task<bool> тогда:

private async Task<bool> RefreshContactsAsync() 
{ 
    try 
    { 
     ... 
    } 
    catch // TODO: Catch more specific exceptions 
    { 
     return false; 
    } 
    ... 
    return true; 
} 

Лично я бы не поймать исключение, а не позволяя вызывающему абоненту проверить задачу ошибочное состояние, но это другое дело.

+0

Когда я меняю свой catch на 'catch {return false; } 'после изменения моего возвращаемого типа на' Задача 'Я получил это предупреждающее сообщение:« Поскольку этот вызов не ожидается, выполнение текущего метода продолжается до завершения вызова. Рассмотрим применение оператора «ожидание» к результату вызов." – Disasterkid

+0

Проверка задачи на неисправное состояние звучит более интересно, можете ли вы привести простой пример? – Disasterkid

+2

@Pedram: Ну где вы получаете это предупреждение, и попробовали ли вы его совет? Что касается проверки задачи для неисправного состояния - см. Документацию для «Задачи». Хотя, если вы ждете задания, исключение будет заменено вместо этого. –

Смежные вопросы