asynchronous - 对 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
,但是因为我已经将它标记为已回答我决定做一个新的
解决方案
您的问题是您的代码如何调用异步方法:
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))
推荐阅读
- java - 如何在泛型参数中指定我的数据类型
- .net - 检查是否启用了 .netfx3,如果没有启用 .netfx3
- r - 如何将数组公式从 R 写入 excel,例如 {=C2:C11*D2:D11}
- matlab - Matlab 一个图例行中的多个条目
- css - display:none 被附加到上传到 Wordpress 的图像
- java - 如何杀死发送长时间运行的 HTTP 请求的线程?
- javascript - 计算数组中有多少具有特定名称的条目并保存以供以后使用
- python - Python - 根据条件分配值
- angular - 渐进式网络调用旧的网络托管应用程序
- vue.js - Vuex 双向可编辑绑定