async方法的Getter属性没有完成执行
本文关键字:执行 属性 方法 Getter async | 更新日期: 2023-09-27 17:53:35
问题:方法未完成执行(没有例外,http请求处于pending
状态)
我必须实现下一个接口:
public interface IQueryableUserStore<TUser, in TKey> : IUserStore<TUser, TKey>, IDisposable where TUser : class, IUser<TKey>
{
IQueryable<TUser> Users { get; }
}
我是这样做的:
public IQueryable<User> Users {
get { return (this._userRepository.GetAll().Result).AsQueryable(); }
}
下面是GetAll()
的实现:
public async Task<IEnumerable<User>> GetAll() {
const string query = @"
select * from [dbo].[User]
";
return (await this._db.QueryAsync<User>(query, new {}));
}
编辑:我从方法和方法调用中删除异步行为,它工作。但是为什么它不能与异步一起工作呢?
如此:
public IQueryable<User> GetAll() {
const string query = @"
select * from [dbo].[User]
";
return this._db.Query<User>(query, new {}).AsQueryable();
}
Task.Result
很容易导致死锁,我在我的博客上解释过。
你需要决定你的数据库访问是同步的还是异步的。如果是同步的,那么就一直同步:
public IQueryable<User> GetAll() {
const string query = @"
select * from [dbo].[User]
";
return this._db.Query<User>(query, new {}).AsQueryable();
}
如果是异步的,那么就一直异步:
public interface IQueryableUserStore<TUser, in TKey> : IUserStore<TUser, TKey>, IDisposable where TUser : class, IUser<TKey>
{
Task<IQueryable<TUser>> GetUsers();
}
在绝大多数情况下,Sync-over-async是一种反模式。我将在MSDN的一篇文章中详细讨论异步原则。