2015-05-17 32 views
0

在客户端应用程序中,我使用从下面的代码被称为是一个异步WCF方法:代表多次调用从异步WCF方法

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

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

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

我该如何让代理调用,但一旦完成doActiveDx()?

TIA

回答

1

进行到doActiveDx通话时,都会委托再次注册。这会导致在对doActiveDx的后续调用中多次调用委托。

确保您只注册一次代表。例如,尝试在doActiveDx功能之外注册它。

+1

或者您每次都注销,这样您不太可能创建内存泄漏。 – Aron

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

这意味着,因为它是一个新的实例每次你不会有多个呼叫。

+0

@Krptos很多在这里学习。谢谢 :) –