我已经创建了用于验证我的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;
}
Run Code Online (Sandbox Code Playgroud)
从另一个函数调用此函数如下:
public bool GetJsonAndValidate()
{
bool isValid = true;
string jsonData = GetJson();
//******* Here I am getting the error.
bool isValid = MyValidationFunction(jsonData).Wait();
}
Run Code Online (Sandbox Code Playgroud)
当我试图打电话时MyValidationFunction,如上所述,显示错误.我试图通过使用Result属性获得结果,但它是抛出和错误.我的班级只是简单的公共班级.我可以用同步调用来做,但我需要异步调用MyValidationFunction从数据库获取结果.如果我没有使用bool变量来捕获结果,那么它工作正常.我错过了什么?如何从验证功能中获取bool结果?
Yel*_*yev 31
声明1. .Wait()没有退货结果.它是一种void方法,因此无法将其结果分配给变量.
您可以使用.Result哪个将等到Task完成并返回结果.
// 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;
Run Code Online (Sandbox Code Playgroud)
但是,它对于通常的任务都有效,但不适用于异步/等待功能,因为......
声明2.不要混淆异步.Wait()- 它仍然会阻塞线程,杀死async/await的想法并否定所有性能改进.
它还会导致WinForms,WPF,ASP.NET和其他环境中的死锁SynchronizationContext.在Stephen Cleary的文章或StackOverflow问题中阅读更多相关内容:
简单的规则:如果你使用async,那么你使用await.
// That's how you do it with async/await:
public async bool GetJsonAndValidate()
{
string jsonData = GetJson();
bool isValid = await MyValidationFunction(jsonData);
}
Run Code Online (Sandbox Code Playgroud)
它不会阻塞线程并启用异步行为.
改变这个:
bool isValid = MyValidationFunction(jsonData).Wait();
Run Code Online (Sandbox Code Playgroud)
到
bool isValid = MyValidationFunction(jsonData).Result;
Run Code Online (Sandbox Code Playgroud)
Task.Wait 的返回类型是void。任务.结果等待并从任务中获取结果。
与 OP 的问题无关,但混合异步和等待(或结果)是个坏主意。如果您的应用程序依赖于 SynchronizationContext,您可能会因为死锁而在应用程序中出现奇怪的挂起
我一直在使用异步方法并且总是这样使用它:
bool isValid = await MyValidationFunction(jsonData);
Run Code Online (Sandbox Code Playgroud)
我看到了提供的答案。
有时.Result会死掉。所以,我建议你使用await而不是.Result。