委托从异步WCF方法多次调用

时间:2015-05-17 18:33:00

标签: c# wcf delegates

在客户端应用程序中,我使用的是从以下代码调用的异步WCF方法:

 public void doActiveDx()
    {
        this.dataservice.GetActiveDxCompleted += (s,e) =>
        {
          ...do something...                
        };
        this.dataservice.GetActiveDxAsync( );
    } 

为什么在调用doActiveDx()时多次调用委托?但是一次?

在我的情况下,...做某事......,正在更新绑定到显示器的可观察集合,因此多次调用委托会导致显示器上的闪烁效果。

如何在完成doActiveDx()???

时调用该委托

TIA

2 个答案:

答案 0 :(得分:1)

每次调用doActiveDx时,代表都会再次注册。这导致在后续调用doActiveDx时多次调用委托。

确保您只注册一次委托。例如,尝试将其注册到doActiveDx函数之外。

答案 1 :(得分:1)

@ Thiago-Sá对您遇到的问题是正确的。我现在将给你一些关于如何修复它的提示。

如果可能,请GetActiveDxAsync()返回Task。然后,您可以为您的代理人添加continuation,如下所示:

this.dataservice.GetActiveDxAsync()
    .ContinueWith(() =>
    {
        // do something
    };

如果你使用.Net 4.5和C#5,你也可以使用async/await(前提是任务像第一点一样返回):

await this.dataservice.GetActiveDxAsync();
// do something after the completion

其他评论:在我自己的WCF服务实现中,我经常在客户端使用代理。此代理继承自ClientBase,每次需要拨打电话时都会创建。所以我经常最终得到如下代码:

var proxy = new DataServiceProxy();
proxy.GetActiveDxCompleted += (s,e) =>
{
    try
    {
        // do something
    }
    finally
    {
        proxy.Close();
    }                
};
proxy.GetActiveDxAsync();

这意味着每次你没有多次通话时它都是一个新实例。