2014-06-11 95 views
1

我需要通过IoC解析一个属性,如果不存在,必须对数据库执行。 全矿的资源库的形式为Silverlight和等待失败

Task<FilterResponse> GetFiltersForInquiries(int idIstituto); 

但随着等待/结果被称为我的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秒)

回答

3

Result的属性和在TaskWait()方法是阻塞。从UI线程调用时,这是造成死锁的众所周知的原因,因为一旦任务完成,将继续尝试在被阻塞的UI线程上执行,因此无法执行延续。

为了避免这个问题,请尝试更改您的代码:

var res = await repository.GetFiltersForInquiries(84); 

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

我不能因为我在属性注册下...如果我只将lamda标记为async只有上帝知道它返回给我的属性分辨率! – advapi

+0

在注册之前调用该代码怎么样? –

+0

我的目标是在属性解析时调用它,以避免用户不得不等待那些秒钟,如果他不打算使用使用这些过滤器的函数之一... btw也许我可以尝试做一个方法,检查是否有过滤器,如果没有,它会注册它们.. – advapi