リアルタイムの値を表示するクライアントアプリケーションがあります。値はDDE-Adviseを通じて提供されます。これらのリアルタイム値は、CNCマシンの移動軸です。したがって、このメソッドを介して1分あたり約100のアドバイスがありDdeClientAdvise
ます。
アプリケーションが多くのDDE-Advisesを取得しているとき、突然すべてのAdivesが失われたようです。
私は問題を次のように減らしました:
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...
}
}
コメントLINEAを削除すると、すべてが正常に機能し、アドバイスが失われることはありません。すべてのアドバイスがログに記録されています。
BeginInvokeを有効にすると、しばらくするとDdeClientAdvise
-Methodが呼び出されなくなり、log-entriesがなくなります。
BeginInvoke、EndInvokeで何が間違っていますか?
編集:クラスに関する情報をさらに追加します。