多线程问题与BeginInvoke, EndInvoke
本文关键字:EndInvoke BeginInvoke 问题 多线程 | 更新日期: 2023-09-27 18:02:06
我有一个显示实时值的客户端应用程序。这些值是通过DDE-Advise提供的。这些实时值是数控机床的移动轴。所以每分钟大约有100条建议通过这个DdeClientAdvise
-Method进入。
当应用程序获得许多dde - advice时,似乎突然之间所有的advice都丢失了。
我把问题归结为以下几点:
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...
}
}
如果我删除注释行A,一切工作正常,没有建议丢失。所有的建议都被记录下来了。
如果我启用BeginInvoke,一段时间后,DdeClientAdvise
-方法不再被调用,没有更多的日志条目。
我做错了什么与BeginInvoke, EndInvoke?
编辑:添加更多关于该类的信息
你不需要在DdeClientAdviseCallback中调用EndInvoke
吗?
看起来@Hans Passant是对的:委托正在被垃圾收集。将委托存储在字段中似乎可以解决这个问题。
虽然我改变了整个项目的设计。所以我不能肯定地说,这就解决了问题。