繁体   English   中英

WCF异步调用的同步包装

[英]Synchronous wrapper for WCF asynchronous calls

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

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

无法通过 UI线程在Silverlight中发出同步网络请求 没有解决的办法。 即使您试图欺骗异步方法使其行为同步,也将无法正常工作。 这是因为,如果可能的话,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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM