【问题标题】:Delegate called multiple times from asynchronous WCF method从异步 WCF 方法多次调用委托
【发布时间】:2015-05-18 15:27:34
【问题描述】:

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

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

为什么调用doActiveDx()但调用了多次委托?

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

如何在 doActiveDx() 完成后调用委托?

TIA

【问题讨论】:

    标签: c# wcf delegates


    【解决方案1】:

    每次调用doActiveDx 时,代理都会重新注册一次。这会导致在后续调用 doActiveDx 时多次调用委托。

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

    【讨论】:

    • 或者您每次都注销,这样您就不太可能造成内存泄漏。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-27
      • 2017-06-23
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多