c# - 如何从 C# 中的异步任务 <bool> 函数获取 bool 结果 - 错误 : Cannot implicitly convert type `void' to `bool'

标签 c# asynchronous

我已经创建了任务函数来验证我的 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/

相关文章:

c# - 如何在执行 Oracle 插入语句后从触发器返回序列值?

c# - LINQ 中基于组的字段连接

c# - 如何使用 WCF 解决将共享相同数据源但将为每个客户端具有单独实例/ session 的服务器-客户端系统

c# - C#中三个kinect 2设置之间的通信

c# - 如何仅使用 LocalDB 2016 发布我的 C# winform 程序?

c++ - Boost::进程管链

java - 有什么方法可以将 @Async 用于被调用 N 次但知道它何时处理所有调用的方法?

mysql - NodeJS中mysql查询的计时问题

统一的 Firebase 身份验证错误处理

javascript - 如何处理依赖于多个其他异步函数的异步函数