我知道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
。< / p>
答案 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 >