Silverlight对wcf的同步调用

Silverlight对wcf的同步调用,wcf,silverlight,Wcf,Silverlight,我正在尝试同步通话。但silverlight应用程序在调用endList方法时会锁定自身。在一个简单的控制台应用程序,我可以使异步同步。我看不出问题所在 var svc = new WcfServiceClient(); var ar = svc.BeginList(null, null); var result = svc.EndList(ar); <-- Silverlight hangs here listBox.ItemsSource = result; var

我正在尝试同步通话。但silverlight应用程序在调用endList方法时会锁定自身。在一个简单的控制台应用程序,我可以使异步同步。我看不出问题所在

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

var结果=svc.EndList(ar) Silverlight不支持同步呼叫


是一篇关于同步调用Web服务和解决方法的文章。

简短回答:如果您不在Dispatcher线程上,您可以这样做,例如:

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/命令模式时使用它,其中ViewModels和命令处理dispatcher线程和模型线程之间的切换。这是一个很大的基础工作要做,并有一些陷阱,但当它的工作,它的工作非常出色

如果您想使用类似的现成框架,可以在以下位置找到:。该页面也对体系结构进行了很好的解释