我需要通过IoC解决一个属性,如果不存在则必须在数据库上进行。 我的所有存储库都采用
的形式 Task<FilterResponse> GetFiltersForInquiries(int idIstituto);
但是当调用Wait / Result时,我的UI被冻结,没有调用web服务
我的通话代码是
var container = new Container();
container.RegisterSingle<IBodInquiryRepository>(new BodInquiryRepository());
container.RegisterSingle<FilterResponse>(() =>
{
var repository = container.GetInstance<IBodInquiryRepository>();
var res = repository.GetFiltersForInquiries(84).Result;
return res;
});
因为我不能把异步/等待我能做什么? 如果我在WPF下,我会进行同步调用(需要6-7秒)
答案 0 :(得分:3)
Result
上的Wait()
属性和Task
方法正在阻止。从UI线程调用时,这是一个众所周知的死锁原因,因为一旦任务完成,就会尝试在被阻塞的UI线程上执行延续,以便它不能执行延续。
要避免此问题,请尝试将代码更改为:
var res = await repository.GetFiltersForInquiries(84);
Stephen Cleary的article解释了如何使用async/await
来避免常见的陷阱。
或者,您可以在进行容器注册之前尝试调用async
代码。
var repository = container.GetInstance<IBodInquiryRepository>();
var res = await repository.GetFiltersForInquiries(84);
var container = new Container();
container.RegisterSingle<IBodInquiryRepository>(new BodInquiryRepository());
container.RegisterSingle<FilterResponse>(res);