2

我有一个显示实时值的客户端应用程序。这些值是通过 DDE-Advise 提供的。这些实时值是数控机床的移动轴。因此,每分钟大约有 100 条建议通过这种方法进入DdeClientAdvise
当应用程序获得许多 DDE 建议时,似乎突然所有建议都丢失了。
我将问题简化为以下内容:

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...
  }
}

如果我删除评论 LINE A,一切正常,没有任何建议丢失。所有的建议都被记录下来。
如果我启用 BeginInvoke,一段时间后DdeClientAdvise-Method 不再被调用,不再有日志条目。

BeginInvoke,EndInvoke 我做错了什么?

编辑:添加更多关于课程的信息。

4

2 回答 2

0

您不必EndInvoke在 DdeClientAdviseCallback 内部调用吗?

于 2011-07-15T12:33:13.067 回答
0

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

于 2011-09-08T10:12:08.803 回答