我们异步调用WCF服务。
public partial class ServiceClient : System.ServiceModel.ClientBase<MyService>, MyService
{
......
}
ServiceClient _serviceclient;
void Getproducts(string filter, string augument, EventHandler<GetCompletedEventArgs> callback)
{
_serviceclient.GetAsyncGetproducts(filter, argument, callback);
}
我希望Getproducts函数是同步的。实现这一目标的最佳方法是什么,如下所示
void Getproducts(string filter, string augument, EventHandler<GetCompletedEventArgs> callback)
{
_serviceclient.GetAsyncGetproducts(filter, argument, callback);
//wait until callback comes back and return
}
编辑:代理提供任何同步调用
答案 0 :(得分:2)
您无法在UI线程中在Silverlight中生成同步网络请求。没有解决这个问题。即使你试图欺骗异步方法同步行为,它也行不通。那是因为如果可能的话,UI线程将被阻止,并且应用程序似乎被冻结。这是因为SL中对网络请求的响应总是传递给UI线程;如果你在UI线程本身等待它,那么你就会造成死锁。
你基本上有两个选择:首选的是实际进入异步路由。如果你只习惯同步编程,那么一开始很难,但这是一项非常有价值的技能。另一种选择是在后台线程上进行调用。我已经尝试了它并且它有效,有些人有blogged about it,所以你也可以试试。但是AFAIK没有得到官方支持。
答案 1 :(得分:1)
除了将回调参数作为回调传递,您还需要分配自己的回调来执行该方法,而不是执行其他操作。你实际上只需要触发某种事件。我已经演示了使用任务的一种方法,但您可以轻松地使用自动重置事件或任何其他同步方法之一。
void Getproducts(string filter, string augument, EventHandler<GetCompletedEventArgs> callback)
{
var tcs = new TaskCompletionSource<bool>();
_serviceclient.GetAsyncGetproducts(filter, argument, args =>
{
callback(args);
tcs.SetResult(true);
});
tcs.Task.Wait();
}