2

リアルタイムの値を表示するクライアントアプリケーションがあります。値は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で何が間違っていますか?

編集:クラスに関する情報をさらに追加します。

4

2 に答える 2

0

EndInvokeDdeClientAdviseCallback内で呼び出す必要はありませんか?

于 2011-07-15T12:33:13.067 に答える
0

@Hans Passantは正しかったようです。デリゲートは、ガベージコレクションを取得していました。デリゲートをフィールドに保存すると、問題が解決するようです。
プロジェクト全体のデザインを変更しましたが。ですから、これで問題が解決したとは言えません。

于 2011-09-08T10:12:08.803 に答える