如何从C#中的异步任务<bool>函数获取bool结果 - 错误:无法将类型`void'隐式转换为`bool'

Isw*_*war 11 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;
 }
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)

它不会阻塞线程并启用异步行为.


bas*_*hrc 5

改变这个:

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,您可能会因为死锁而在应用程序中出现奇怪的挂起

  • 它会在 WinForms、WPF、ASP.NET 中陷入僵局。 (4认同)

Bob*_*ger 5

我一直在使用异步方法并且总是这样使用它:

bool isValid = await MyValidationFunction(jsonData);
Run Code Online (Sandbox Code Playgroud)

我看到了提供的答案。

有时.Result会死掉。所以,我建议你使用await而不是.Result。