异步方法在Task中返回true或false

时间:2015-07-20 09:50:11

标签: c# asynchronous async-await

我知道async方法只能返回voidTask。我已经在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。< / p>

3 个答案:

答案 0 :(得分:14)

听起来你只需要返回Task<bool>然后:

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

就个人而言,我不会抓住异常,而是让调用者检查任务是否存在故障状态,但这是另一回事。

答案 1 :(得分:6)

将方法签名更改为Task<bool>。然后,如果您的方法声明为异步,则可以简单地返回bool值。但正如jon双向飞碟表示还有其他可能更好的方法来处理你的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)
 }

答案 2 :(得分:2)

很抱歉,但我想你们都误导了这里的人。 请参阅Microsoft文章here

非常简单的示例,它显示了我们如何从Task返回bool或string类型的值。

我在这里发布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 >