0

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

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

4

2 回答 2

2

不能在 Silverlight 中从 UI 线程发出同步网络请求。没有办法解决这个问题。即使您尝试欺骗异步方法以同步行为,它也不起作用。那是因为如果可能的话,UI 线程将被阻塞,并且应用程序看起来会被冻结。发生这种情况是因为 SL 中对网络请求的响应总是传递给 UI 线程;如果您在 UI 线程本身上等待它,那么您将创建一个死锁。

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

于 2013-02-04T22:37:46.757 回答
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();
}
于 2013-02-04T15:01:33.347 回答