La propriété Getter avec la méthode asynchrone ne termine pas son exécution

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

Question

Problème : la méthode ne termine pas son exécution (aucune exception, requête http en pending ).

Je dois implémenter la prochaine interface:

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

Je l'ai fait comme ça:

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

Voici l' GetAll() :

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

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

Edit: Je supprime le comportement asynchrone de la méthode et de l'appel de méthode et cela fonctionne. Mais pourquoi ne devrait-il pas fonctionner avec async?

Cela marche:

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

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

Réponse populaire

Task.Result peut facilement causer des blocages , comme je l'explique sur mon blog.

Vous devez décider si vous souhaitez que votre accès à la base de données soit synchrone ou asynchrone. Si synchrone, alors synchronisez tout le chemin:

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

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

Si asynchrone, alors allez asynchrone tout le chemin:

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

Sync-over-async est un anti-comportement dans la grande majorité des cas. Je parle plus du principe de l’ async tout au long d’un article MSDN.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi