BeginInvoke,EndInvoke的多线程问题?

时间:2011-07-15 12:21:28

标签: c# .net begininvoke

我有一个客户端应用程序,它显示实时值。这些值通过DDE-Advise提供。这些实时值是cnc机器的移动轴。因此,通过此DdeClientAdvise - 方法,大约有100条建议每分钟进入。
当应用程序获得许多DDE-Advises时,似乎突然所有的adivses都丢失了 我将问题减少到以下几点:

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 - 方法,不再有日志条目。

我在使用BeginInvoke,EndInvoke做错了什么?

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

2 个答案:

答案 0 :(得分:0)

你不必在DdeClientAdviseCallback中调用EndInvoke吗?

答案 1 :(得分:0)

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