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();
}

async方法的Getter属性没有完成执行

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的一篇文章中详细讨论异步原则。