2010-06-18 105 views
1

我正在嘗試撥打電話進行同步。但是,在調用endList方法時,silverlight應用程序會自行鎖定。在一個簡單的控制檯應用程序中,我可以使異步同步。看不到問題。Silverlight同步調用wcf

var svc = new WcfServiceClient(); 
    var ar = svc.BeginList(null, null); 
    var result = svc.EndList(ar); <-- Silverlight hangs here 
    listBox.ItemsSource = result; 

回答

2

Silverlight不支持同步呼叫。

Here是關於同步調用Web服務和解決方法的文章。

0

簡短的回答:你可以做,如果你是不是調度線程上,是這樣的:

System.Threading.ThreadPool.QueueUserWorkItem(state => 
    { 
     IAsyncResult asyncResult = svc.BeginSomething(null, null); 

     if (!asyncResult.CompletedSynchronously) 
     { 
      asyncResult.AsyncWaitHandle.WaitOne(); 
     } 

     try 
     { 
      svc.EndSomething(asyncResult); 
     } 
     catch 
     { 
      throw; 
     } 
     finally 
     { 
      asyncResult.AsyncWaitHandle.Close(); 
     } 
    }); 

這樣做的最大的好處是,你可以保持您的域模型層同步像過去,你可以很容易地實現等懶加載...

在實踐中你只能使用它時,你設計你的應用程序要嚴格遵守MVVM/指揮模式,在那裏你r ViewModels和Commands處理調度程序線程和模型線程之間的切換。這需要做大量的地面工作,並且有一些陷阱,但是當它工作時,它的工作非常好。

如果您想要使用類似工作的即用型框架,可在此處獲得:CodeProject: Introducing the Model Thread View Thread Pattern。該頁面上的體系結構也得到了很好的解釋。