it-roy-ru.com

Асинхронный метод для возврата true или false в Задаче

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

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

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

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

5
Disasterkid

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

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

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

12
Jon Skeet

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

 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)
 }
4
Boas Enkler

Извините, но я думаю, что вы вводите людей в заблуждение здесь. Посмотрите статью Microsoft, здесь .

Очень простой пример, который показывает, как мы можем вернуть значение типа bool или string из Task.

Я публикую здесь код C # для потомков:

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 >
0
woohoo