- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我已经创建了任务函数来验证我的 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
来获得结果属性(property),但它是抛出和错误。我的类(class)只是简单的公共(public)类(class)。我可以通过同步调用来完成,但我需要异步调用 MyValidationFunction
从数据库中获取结果。如果我没有使用 bool 变量来捕获结果,那么它就可以正常工作。我错过了什么?我怎样才能从我的验证函数中得到 bool 结果?
最佳答案
声明 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;
但是,它对普通任务都有效,但对异步/等待功能无效,因为...
声明 2. 不要混淆 async 和 .Wait()
- 它仍然阻塞线程,扼杀了异步/等待的想法并否定了所有的性能改进。
它还会在 WinForms、WPF、ASP.NET 和其他具有 SynchronizationContext
的环境中导致死锁。在此 Stephen Cleary's article 中阅读更多相关信息或者在这些 StackOverflow 问题中:
简单的规则:如果你使用异步,那么你就使用等待。
// That's how you do it with async/await:
public async bool GetJsonAndValidate()
{
string jsonData = GetJson();
bool isValid = await MyValidationFunction(jsonData);
}
它不会阻塞线程并启用异步行为。
关于c# - 如何从 C# 中的异步任务 <bool> 函数获取 bool 结果 - 错误 : Cannot implicitly convert type `void' to `bool' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45138268/
我是一名优秀的程序员,十分优秀!