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

本文关键字:调用 异步 WCF 方法 | 更新日期: 2023-09-27 17:49:25

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

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

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

就我而言,……做一些……,正在更新一个绑定到显示的可观察集合,所以多次调用委托会导致显示上的闪烁效果。

我怎么能有委托调用,但一旦完成doActiveDx() ??

TIA

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

每次执行对doActiveDx的调用时,都会再次注册委托。这将导致在后续调用doActiveDx时多次调用委托。

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

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

如果可能,使GetActiveDxAsync()返回Task。然后,您可以在委托中添加延续,如下所示:

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

这意味着,由于每次都是一个新实例,因此不会有多个调用。