비동기 메서드가있는 Getter 속성이 실행을 완료하지 않습니다.

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

문제

문제점 : 메소드가 실행을 완료하지 않습니다 (예외없이 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();
}

Sync-over-async는 대부분의 경우 반 패턴입니다. MSDN 기사에서 비동기 원칙에 대해 자세히 설명합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.