2015-06-04 42 views
2

问题:方法没有完成执行(没有例外,http请求在pending状态)。异步方法的Getter属性没有完成执行

我要实现一个界面:

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

我觉得你需要'await'以及从'get'返回。 –

+1

@Amit Kumar Ghosh,有'GetAll()。Result',应该提供'await'行为,不是吗? – FSou1

+1

'IQueryable '是'IEnumable '。 'IEnumerable'在你强制执行之前不会被评估。一些提示/解释在我的老问题上可以在这里:http://stackoverflow.com/questions/6677722/ienumerable-vs-iqueryable-for-business-logic-or-dal-return-types - Smudge202

回答

2

Task.Result can easily cause deadlocks,因为我在我的博客解释。

您需要决定是否要让数据库访问同步或异步。如果同步,然后去同步一路:

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 all the way的原理。

+0

Thx为您的答复。但IQueryableUserStore是Microsoft.AspNet.Identity接口https://msdn.microsoft.com/zh-cn/library/dn613228(v=vs.108).aspx – FSou1