我在试着同步通话。但silverlight应用程序在调用endList方法时会锁定自身。在一个简单的控制台应用程序中,我可以使异步同步。看不到问题。
var svc = new WcfServiceClient();
var ar = svc.BeginList(null, null);
var result = svc.EndList(ar); <-- Silverlight hangs here
listBox.ItemsSource = result;发布于 2010-06-18 17:06:19
Silverlight不支持同步调用。
Here是一篇关于同步调用and服务和解决方法的文章。
发布于 2010-06-18 17:21:06
简而言之:如果您不在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。架构在该页面上也有很好的解释。
https://stackoverflow.com/questions/3068266
复制相似问题