У меня есть клиентское приложение, которое отображает значения в реальном времени. Значения предоставляются через DDE-Advise. Эти значения в реальном времени представляют собой движущуюся ось станка с ЧПУ. Таким образом, через этот DdeClientAdvise
метод поступает около 100 советов в минуту.
Когда приложение получает много 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
-Метод больше не будет вызываться, больше не будет записей в журнале.
Что я делаю неправильно с BeginInvoke, EndInvoke?
Изменить: добавить дополнительную информацию о классе.
DdeClient
подписывается на DDE-сервер. МетодDdeClientAdvise
является обратным вызовом для событияAdvise
классаDdeClient
. - person WaltiD   schedule 15.07.2011CallbackDelegate
? Поэтому я бы использовал такое поле, какprivate CallbackDelegate _callbackDelegate;
. Но я хотел бы вызывать нового делегата для каждого совета DDE. - person WaltiD   schedule 15.07.2011