La propiedad Getter con el método async no termina de ejecutarse

.net asp.net asp.net-identity c# dapper

Pregunta

Problema : el método no termina de ejecutarse (sin excepción, la solicitud http en estado pending ).

Tengo que implementar la próxima interfaz:

public interface IQueryableUserStore<TUser, in TKey> : IUserStore<TUser, TKey>, IDisposable where TUser : class, IUser<TKey>
{
    IQueryable<TUser> Users { get; }
}

Lo hice así:

public IQueryable<User> Users {
    get { return (this._userRepository.GetAll().Result).AsQueryable(); }
}

Aquí está la implementación GetAll() :

public async Task<IEnumerable<User>> GetAll() {
    const string query = @"
        select * from [dbo].[User]
    ";

    return (await this._db.QueryAsync<User>(query, new {}));
}

Editar: elimino el comportamiento asincrónico del método y la llamada al método y funciona. ¿Pero por qué no debería funcionar con asincrónico?

Esto funciona:

public IQueryable<User> GetAll() {
    const string query = @"
        select * from [dbo].[User]
    ";

    return this._db.Query<User>(query, new {}).AsQueryable();
}

Respuesta popular

Task.Result puede causar bloqueos , como explico en mi blog.

Debe decidir si desea que su acceso a la base de datos sea síncrono o asíncrono. Si es sincrónico, entonces síncrono en todo el camino:

public IQueryable<User> GetAll() {
  const string query = @"
    select * from [dbo].[User]
  ";

  return this._db.Query<User>(query, new {}).AsQueryable();
}

Si es asincrónico, entonces ve asincrónico todo el camino:

public interface IQueryableUserStore<TUser, in TKey> : IUserStore<TUser, TKey>, IDisposable where TUser : class, IUser<TKey>
{
  Task<IQueryable<TUser>> GetUsers();
}

Sync-over-async es un antipatrón en la gran mayoría de los casos. Hablo más sobre el principio de asincrónico en un artículo de MSDN.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué