@joyrax-dev

Почему await код выполняется с задержкой?

Пишу сайт и код который выполняется асинхронно выполняется с задержкой, с первого раза он как будто не выполняется, а последующие разы он выполняется с задержкой до другого вызова метода

Технологии: SignalR, ASP.NET, Blazor WASM, MongoDB

AuthHub.cs на стороне сервера

using Microsoft.AspNetCore.SignalR;
using MongoDB.Driver;
using MongoDB.Bson;
using RayLight.Shared;

namespace RayLight.Server.Hubs;

public class AuthHub : Hub
{
    public async Task Registration(RegistrationData data)
    {
        string sender = this.Context.ConnectionId;

        IMongoDatabase db = Program.MongoClient.GetDatabase("Test1");
        // await db.CreateCollectionAsync("Users");

        IMongoCollection<User> Users = db.GetCollection<User>("Users");
        
        FilterDefinition<User> filter_login = Builders<User>.Filter.Eq(c => c.Login, data.Login);
        FilterDefinition<User> filter_email = Builders<User>.Filter.Eq(c => c.Email, data.Email);

        long result_find_login = Users.Find<User>(filter_login).CountDocuments();
        long result_find_email = Users.Find<User>(filter_email).CountDocuments();

        if (result_find_email > 0)
        {
            Console.WriteLine("Юзер с такой почтой зарегистрирован уже");
            await this.Clients.Caller.SendAsync("RegistrationError");
        }
        else if (result_find_login > 0)
        {
            Console.WriteLine("Юзер с таким логином зарегистрирован уже");
            await this.Clients.Caller.SendAsync("RegistrationError");
        }
        else
        {
            User new_user = new User()
            {
                Login = data.Login,
                Email = data.Email,
                Password = data.Password
            };

            await Users.InsertOneAsync(new_user);
            await this.Clients.Caller.SendAsync("RegistrationComplete");
            Console.WriteLine("Юзер зарегестрирован");
        }
    }
}


Registration.razor на стороне браузера

@page "/registration"
@using Microsoft.AspNetCore.SignalR.Client
@using RayLight.Shared
@inject NavigationManager Navigation
@implements IAsyncDisposable


<div>@Notify</div>
<hr>
<input @bind="Login" type="text" name="login" placeholder="Login">
<input @bind="Email" type="email" name="email" placeholder="Email">
<input @bind="Password" type="password" name="password" placeholder="Password">
<hr>
<button @onclick="Registry">Registration</button>

@code 
{
    private HubConnection? AuthHub;

    private string? Login { get; set; }
    private string? Email { get; set; }
    private string? Password { get; set;}

    private string? Notify { get; set; }

    protected override async Task OnInitializedAsync()
    {
        AuthHub = new HubConnectionBuilder()
            .WithUrl(Navigation.ToAbsoluteUri("/AuthHub"))
            .Build();
        
        AuthHub.On("RegistrationComplete", () => 
        {
            this.Notify = "Registration Complete";
        });
        AuthHub.On("RegistrationError", () => 
        {
            this.Notify = "Registration Error";
        });
        
        await AuthHub.StartAsync();
    }

    private async Task Registry()
    {
        if (AuthHub is not null)
        {
            RegistrationData data = new RegistrationData()
            {
                Login = this.Login,
                Email = this.Email,
                Password = this.Password
            };
            @* await hubConnection.SendAsync("SendMessage", userInput, messageInput); *@
            await AuthHub.SendAsync("Registration", data);
        }
    }

    public async ValueTask DisposeAsync()
    {
        if (AuthHub is not null)
        {
            await AuthHub.DisposeAsync();
        }
    }
}


задержка по типу выполняешь функцию а оно показывает результат который происходил при выполнении функции в прошлый раз, ну это только через SignalR, а вот в консоли нормально все происходит
  • Вопрос задан
  • 70 просмотров
Решения вопроса 1
@joyrax-dev Автор вопроса
Оказалось что blazor сам не перерисовывает компонент при изменении поля.
Достаточно вызвать функцию в компоненте
StateHasChanged();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы