我需要通过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秒的时间)
最佳答案
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);
关于c# - Silverlight和等待失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24162370/