Проблема многопоточности с BeginInvoke, EndInvoke? - PullRequest
2 голосов
/ 15 июля 2011

У меня есть клиентское приложение, которое отображает значения в реальном времени. Значения предоставляются через DDE-Advise. Эти значения в реальном времени являются движущейся осью станка с ЧПУ. Таким образом, существует около 100 советов в минуту , поступающих через этот DdeClientAdvise -метод.
Когда приложение получает много DDE-Advises, кажется, что внезапно все объявления теряются.
Я уменьшил проблему до следующего:

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 -Metod больше не будет вызываться, больше нет записей в журнале.

Что я делаю не так с BeginInvoke, EndInvoke?

Редактировать: Добавить еще информацию о классе.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2011

Кажется, @ Ханс Пассант был прав: делегат собирал мусор.Хранение делегата в поле, кажется, решает проблему.
Хотя я изменил дизайн всего проекта.Поэтому я не могу точно сказать, что это решило проблему.

0 голосов
/ 15 июля 2011

вам не нужно звонить EndInvoke внутри DdeClientAdviseCallback?

...