我有一个客户端应用程序,它显示实时值。这些值通过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做错了什么?
编辑:添加有关该课程的更多信息。
答案 0 :(得分:0)
你不必在DdeClientAdviseCallback中调用EndInvoke
吗?
答案 1 :(得分:0)
似乎@Hans Passant是对的:代表正在收集垃圾。将代表存放在一个字段中似乎可以解决问题 虽然我改变了整个项目的设计。所以我不能肯定地说,这解决了这个问题。