Silverlight同步调用wcf

时间:2010-06-18 08:49:54

标签: wcf silverlight

我正在尝试拨打同步电话。但是当调用endList方法时,silverlight app会自行锁定。在一个简单的控制台应用程序中,我可以使异步同步。看不出问题。

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

2 个答案:

答案 0 :(得分:2)

Silverlight不支持同步通话。

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

答案 1 :(得分:0)

简短回答:如果您不在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和命令处理调度程序线程和模型线程之间的切换。这需要做很多基础工作,并且有一些问题,但是当它工作时,它的工作非常好。

如果您想使用类似工作的即用型框架,可以在此处获取:CodeProject: Introducing the Model Thread View Thread Pattern。在该页面上也很好地解释了该架构。