Как предотвратить тупик с помощью Usermanager? - PullRequest
0 голосов
/ 27 марта 2020

У меня есть страница регистрации на блазоре (сервере). На этой странице я хочу реализовать функцию регистрации, используя AspnetCor.Identity

Это метод: (_usermanager имеет тип AspNetCore.Identity.UserManager <>)

  public bool Register(RegisterUser regUser)
    {
        var newUser = new ApplicationUser { Email = regUser.Mail, UserName = regUser.Mail};           
        var sd= _userManager.CreateAsync(newUser, "password").Result;
        if (!sd.Succeeded)
        {                
            return false;
        }
        return true;
    }

Метод вызывается из HandleValidSubmit на странице блейзора:

<EditForm Model="@_registerUser" OnValidSubmit="HandleValidSubmit">
//...
</EditForm>
@code {
      private void HandleValidSubmit()
        {
            if (identity.Register(_registerUser)) {
              NaviationManager.NavigateTo($"/manage/registersent");
            }
        }
}

Если регистрация не удалась, она работает так же, как и при возвращении false. Но когда регистрация будет в порядке, я оказываюсь в тупике на _userManager.CreateAsync(newUser, "password").Result;

Когда я не пытаюсь сделать асин c -текл синхронным и заменить вызов на _userManager.CreateAsync(newUser, "password") (и просто игнорирую любые возвращаемое значение) пользователь создается без проблем.

Как мне обработать асинхронный вызов c с возвращаемым значением из HandleValidSubmit?

1 Ответ

1 голос
/ 27 марта 2020

Сделайте все async - верните Task с и await, используя их соответствующим образом. Не звоните .Result или .Success. Пусть компилятор поможет вам лучше написать код asyn c.

Например, make HandleValidSubmit asyn c.

private async void HandleValidSubmit()
{
    if (await identity.RegisterAsync(_registerUser)) 
    {
        NaviationManager.NavigateTo($"/manage/registersent");
    }
}

async void следует использовать только для типа события вещи, так как они похожи на «огонь и забыть».

...