OWIN身份验证:异步方法缺少'await'运算符

16 浏览
0 Comments

OWIN身份验证:异步方法缺少'await'运算符

我在项目中实现了OWIN身份验证。但是当我尝试构建该项目时,出现了一些错误。

显示错误的方法:

 public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
    //代码    
   }
  public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
  //代码 
    }

显示的错误是:

此异步方法缺少'await'操作符,将以同步方式运行。考虑使用'await'操作符等待非阻塞的API调用,或者使用'await Task.Run(...)'在后台线程上执行CPU绑定的工作。

如何解决这个问题?

0
0 Comments

问题:OWIN身份验证:异步方法缺少'await'操作符的原因以及解决方法

在上述代码中,问题出现的原因是在方法签名中使用了async关键字,但是方法内部没有使用await操作符。在重写异步方法时,并不需要强制在重写的方法中标记为async。

解决方法是在方法签名中移除async关键字,即将代码修改为如下形式:

public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
  //code    
}
public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
  //code 
}

但是当我将方法签名中的async关键字移除后,出现了错误'not all code paths return a value'(并非所有代码路径都返回值)。

解决这个错误的方法是在每个重写的方法中添加一个返回Task的语句,以确保所有代码路径都有返回值。可以使用Task.CompletedTask来表示异步任务已经完成,不需要返回具体结果。

修改后的代码如下所示:

public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
  //code    
  return Task.CompletedTask;
}
public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
  //code 
  return Task.CompletedTask;
}

通过以上修改,可以解决'not all code paths return a value'错误,同时保持方法重写的异步特性。

0
0 Comments

问题的出现原因是在异步方法中缺少了'await'操作符。解决方法是移除'async'修饰符,并返回一个Task对象,可以使用Task.FromResult(null)来实现。

0