首页 > 解决方案 > 对 DB 的调用卡在 await 上(但在从 Blazor 组件调用时有效)

问题描述

从 调用方法时.cs file,应用程序卡在等待行;但如果我从它那里调用它,.razor它就完美无缺。

。CS

public AccountService(IUserData userData)
{
    _userData = userData;
}
...
public async Task<bool> Validate(string userId, string password)
{
    ...
    try
    {
        List<UserModel> users = new List<UserModel<();
        users = await _userData.GetUsers();
        //NEVER GETS HERE
        return true;
    }
    catch (Exception ex)
    {
         return false;
    }
    ...
}

。剃刀

@inject IUserData _db;

@code {
    private List<UserModel> users;
    ...
    protected override async Task OnInitializedAsync()
    {
        users = await _db.GetUsers();
    }
    ...

用户数据

    public class UserData : IUserData
    {
        private readonly ISqlDataAccess _db;

        public UserData(ISqlDataAccess db)
        {
            _db = db;
        }

        public Task<List<UserModel>> GetUsers()
        {
            string sql = "Select *from dbo.Users";
            return _db.LoadData<UserModel, dynamic>(sql, new { });
    }
    ...
}

用户数据

    public interface IUserData
    {
        Task<List<UserModel>> GetUsers();
        ...
    }

数据库访问

        public async Task<List<T>> LoadData<T, U>(string sql, U parameters)
        {
            string connectionString = _config.GetConnectionString(ConnectionStringName);

            using (IDbConnection connection = new SqlConnection(connectionString))
            {
                var data = await connection.QueryAsync<T>(sql, parameters); //I GET STUCK HERE
                return data.ToList();
            }
        }

数据库访问

Task<List<T>> LoadData<T, U>(string sql, U parameters);

PS 我用这个问题更新了这篇文章https://stackoverflow.com/questions/68225154/implementing-an-interface-on-a-class-with-dependency-injection,但是因为我已经将它标记为已回答我决定做一个新的

标签: asynchronousblazorblazor-server-side

解决方案


您的问题是您的代码如何调用异步方法:

if (((AccountService)AccountService).Validate(user.UserCredentials, user.Password).Result)

.Result 可能看起来很奇怪,但否则我会收到一个错误:can't convert ...Task to bool

此错误的正确解决方案是使用await,而不是Result

if (await ((AccountService)AccountService).Validate(user.UserCredentials, user.Password))

使用Result会导致死锁


推荐阅读