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

dis*_*kid 9 c# asynchronous async-await

我知道async方法只能返回voidTask.我已经阅读了类似方法中的异常处理async方法.我是async编程新手,所以我正在寻找一个简单的解决方案.

我的async方法运行一个Sql查询.如果查询没问题,它应该用布尔值通知调用者true,否则通知a false.我的方法目前无效,所以我无从得知.

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

我只想改变async,Task以便在我的catch声明中,该方法将返回a false,否则为a true.

Jon*_*eet 16

听起来你只需要返回一个Task<bool>:

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

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

  • @Pedram:那你在哪里得到那个警告,并且你是否尝试过遵循它的建议?至于检查故障状态的任务 - 请参阅"任务"的文档.虽然如果等待任务,则会重新引发异常. (2认同)
  • @Pedram:是的.听起来你基本上需要退后一步,想一想异步刷新联系人意味着什么...... (2认同)

Boa*_*ler 9

将方法签名更改为Task<bool>。然后,如果您的方法被声明为异步,则可以简单地返回布尔值。但正如乔恩·斯凯特(Jon skeet)所说,还有其他可能更好的方法来处理您的szenario

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

PS:您可能会遇到的另一个常见问题是,如果您有一个没有异步的方法。然后,您可以Task.FromResult(true)像这样返回:

 private Task<bool> RefreshContacts()
 {
     ....
    return Task.FromResult(true)
 }
Run Code Online (Sandbox Code Playgroud)