War*_*nce 1 c# asynchronous ldap owin identityserver3
我正在将身份验证过程转换为支持异步,VS 2015 IDE 警告我以下消息: 异步方法缺少“等待”运算符并将同步运行...等等...
不管怎样,代码连接到 LDAP 存储并验证用户的帐户等等...我已经尝试过使用 wait 进行各种操作,但我只是在这里遗漏了一些东西。我将代码恢复到之前的状态。我将不胜感激任何有关使其正确支持异步的指导...
这是代码:
public async Task<User> GetAsyncADUser(PrincipalContextParameter param)
{
try
{
if (UseLDAPForIdentityServer3)
{
using (var pc = new PrincipalContext(ContextType.Domain, param.ADDomain, param.ADServerContainer, param.ADServerUser, param.ADServerUserPwd))
{
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(pc, param.UserNameToValidate);
if (userPrincipal != null)
{
bool isvalid = pc.ValidateCredentials(userPrincipal.DistinguishedName, param.UserPasswordToValidate, ContextOptions.SimpleBind);
if (isvalid)
{
User user = new User { ad_guid = userPrincipal.Guid.ToString(), Username = param.UserNameToValidate, Password = param.UserPasswordToValidate };
return user;
}
}
}
}
}
catch (Exception ex)
{
throw;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
来自MSDN:
以下特征总结了异步方法的特点:
按照惯例,方法的名称async以“Async”后缀结尾。返回类型是以下类型之一:
Task<TResult>如果您的方法有一个 return 语句,其中操作数的类型为TResult。Task如果您的方法没有 return 语句或有一个没有操作数的 return 语句。Void如果您正在编写异步事件处理程序。该方法通常至少包含一个await 表达式,它标记了该方法在等待的异步操作完成之前无法继续的点。同时,该方法被挂起,控制权返回到该方法的调用者。本主题的下一部分将说明在暂停点发生的情况。
您可以使用return Task.Run(() => { /* your code here */ })并返回Task<User>. 然后你可以调用这个方法:
User user = await GetAsyncADUser();
Run Code Online (Sandbox Code Playgroud)
这样,就不需要async在 method 中使用关键字GetAsyncADUser,但需要用关键字标记使用上面这行代码的方法async。