将方法转换为使用异步

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)

Zei*_*kki 5

来自MSDN

以下特征总结了异步方法的特点:

  • 方法签名包含 async 修饰符。
  • 按照惯例,方法的名称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