问题 :方法没有完成执行(没有异常,处于pending
状态的http请求)。
我必须实现下一个接口:
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();
}
在绝大多数情况下,同步异步是反模式。我在MSDN文章中更多地讨论了async的原理。