2014-06-11 61 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