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

时间:2017-07-17 07:26:18

标签: 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属性获得结果,但它是抛出错误。我的班级只是简单的公共班级。我可以使用同步调用来完成它但我需要进行异步调用,因为MyValidationFunction从数据库获取结果。如果我没有使用bool变量来捕获结果,那么它可以正常工作。我错过了什么?如何从验证函数中获取bool结果?

3 个答案:

答案 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。