我已经创建了用于验证我的json文件的任务函数。一切正常,直到我没有使用结果。当我尝试从async task<bool> function
获取结果时,它显示错误为Cannot implicitly convert 'void' to bool
。我的异步功能如下:
private async Task<bool> MyValidationFunction(string json)
{
bool isValid = true;
.......DOING MY VALIDATION STUFF.....
return isValid;
}
从另一个函数调用此函数如下:
public bool GetJsonAndValidate()
{
bool isValid = true;
string jsonData = GetJson();
//******* Here I am getting the error.
bool isValid = MyValidationFunction(jsonData).Wait();
}
当我尝试拨打MyValidationFunction
时,如上所述,它显示错误。我试图通过使用Result
属性获得结果,但它是抛出错误。我的班级只是简单的公共班级。我可以使用同步调用来完成它但我需要进行异步调用,因为MyValidationFunction
从数据库获取结果。如果我没有使用bool变量来捕获结果,那么它可以正常工作。我错过了什么?如何从验证函数中获取bool结果?
答案 0 :(得分:27)
声明1。 .Wait()
没有返回结果。它是void
方法,因此无法将结果分配给变量。
您可以使用等待Task
完成的.Result
并返回结果。
// Both are applicable to simple Tasks:
bool isValid = MyValidationFunction(jsonData).Result;
// does that same as
var task = MyValidationFunction(jsonData);
task.Wait();
bool isValid = task.Result;
但是,它对于常规任务都有效,但对于async / await 功能则无效,因为......
声明2。不要混淆异步和.Wait()
- 它仍会阻塞线程,从而消除了async / await的想法,并否定了所有的性能提升。
它还会导致WinForms,WPF,ASP.NET和SynchronizationContext
的其他环境中出现死锁。
在此Stephen Cleary's article或这些StackOverflow问题中了解有关它的更多信息:
简单规则:如果您使用async,则使用等待。
// That's how you do it with async/await:
public async bool GetJsonAndValidate()
{
string jsonData = GetJson();
bool isValid = await MyValidationFunction(jsonData);
}
它不会阻塞线程并启用异步行为。
答案 1 :(得分:3)
改变这个:
bool isValid = MyValidationFunction(jsonData).Wait();
到
bool isValid = MyValidationFunction(jsonData).Result;
Task.Wait的返回类型为 void 。 Task.Result 执行等待并从任务中获取结果。
与OP的问题无关,但混淆异步和等待(或结果)是个坏主意。如果您的应用程序依赖于SynchronizationContext
,则由于死锁会导致您的应用程序出现奇怪的挂起答案 2 :(得分:0)
我一直在使用异步方法,并且总是这样使用它:
bool isValid = await MyValidationFunction(jsonData);
我看到了提供的答案。
有时.Result死了。所以,我建议你使用await而不是.Result。