WCF异步调用的同步包装

本文关键字:同步 包装 调用 异步 WCF | 更新日期: 2023-09-27 17:57:47

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

EDIT:代理提供任何同步调用

WCF异步调用的同步包装

无法在Silverlight中从UI线程发出同步网络请求。这是不能绕过的。即使您试图欺骗异步方法使其行为同步,它也不会起作用。这是因为如果可能的话,UI线程将被阻塞,应用程序将看起来被冻结。这是因为SL中对网络请求的响应总是传递到UI线程;如果在UI线程本身上等待它,那么就会创建死锁。

您基本上有两个选项:首选选项是实际采用异步路由。如果你只习惯于同步编程,一开始这很难,但这是一项非常有价值的技能。另一种选择是在后台线程上进行调用。我试过了,它很有效,有些人在博客上写过它,所以你也可以试试。但AFAIK并没有得到官方的支持。

您不需要将回调参数作为回调传递,而是需要分配自己的回调,以便在执行其他操作的同时执行该方法。实际上,你只需要触发某种事件。我已经演示了一种使用任务的方法,但你也可以很容易地使用自动重置事件或任何其他同步方法。

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