gpt4 book ai didi

c# - 具有异步方法的 Getter 属性未完成执行

转载 作者:太空宇宙 更新时间:2023-11-03 10:29:46 29 4
gpt4 key购买 nike

问题:方法没有完成执行(无异常,http 请求处于pending 状态)。

我必须实现下一个接口(interface):

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

在绝大多数情况下,Sync-over-async 是一种反模式。我多说一下async all the way的原理在 MSDN 文章中。

关于c# - 具有异步方法的 Getter 属性未完成执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30640281/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com