多线程问题与BeginInvoke, EndInvoke

本文关键字:EndInvoke BeginInvoke 问题 多线程 | 更新日期: 2023-09-27 18:02:06

我有一个显示实时值的客户端应用程序。这些值是通过DDE-Advise提供的。这些实时值是数控机床的移动轴。所以每分钟大约有100条建议通过这个DdeClientAdvise -Method进入。
当应用程序获得许多dde - advice时,似乎突然之间所有的advice都丢失了。
我把问题归结为以下几点:

public class NcddeZugriff
{
  private DdeClient _ddeClient; //see http://ndde.codeplex.com/
  public NcDdeZugriff()
  {
    _ddeClient = new DdeClient("ncdde", "machineswitch");
    _ddeClient.Connect();
    _ddeClient.Advise += DdeClientAdvise;
  }
  private delegate void CallbackDelegate(object sender, DdeAdviseEventArgs e);    
  private void DdeClientAdvise(object sender, DdeAdviseEventArgs e)
  {
    CallbackDelegate callbackDelegate = DdeClientAdviseCallback;
    _logging.InfoFormat("Advise-Callback for {0}", e.Item);
    //LINE A : return;
    callbackDelegate.BeginInvoke(sender, e, callbackDelegate.EndInvoke, null);
  }
  private void DdeClientAdviseCallback(object sender, DdeAdviseEventArgs e)
  {
    _logging.InfoFormat("Asynchron for {0}", e.Item);
    //do some work with e.Text...
  }
}

如果我删除注释行A,一切工作正常,没有建议丢失。所有的建议都被记录下来了。
如果我启用BeginInvoke,一段时间后,DdeClientAdvise -方法不再被调用,没有更多的日志条目。

我做错了什么与BeginInvoke, EndInvoke?

编辑:添加更多关于该类的信息

多线程问题与BeginInvoke, EndInvoke

你不需要在DdeClientAdviseCallback中调用EndInvoke吗?

看起来@Hans Passant是对的:委托正在被垃圾收集。将委托存储在字段中似乎可以解决这个问题。
虽然我改变了整个项目的设计。所以我不能肯定地说,这就解决了问题。