WCF异步调用的同步包装器

时间:2013-02-04 14:49:32

标签: c# wcf silverlight asynchronous synchronization

我们异步调用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
}

编辑:代理提供任何同步调用

2 个答案:

答案 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();
}