我正在尝试拨打同步电话。但是当调用endList方法时,silverlight app会自行锁定。在一个简单的控制台应用程序中,我可以使异步同步。看不出问题。
var svc = new WcfServiceClient();
var ar = svc.BeginList(null, null);
var result = svc.EndList(ar); <-- Silverlight hangs here
listBox.ItemsSource = result;
答案 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。在该页面上也很好地解释了该架构。