2011-07-15 7 views
2

私は、リアルタイムの値を表示するクライアントアプリケーションを持っています。値はDDE-Adviseによって提供されます。これらのリアルタイム値は、CNCマシンの軸を動かしています。したがって、約100件のアドバイスがある1分あたりこれは、を使っています。
アプリケーションが多くのDDE-Advisesを取得すると、突然すべてのadivsesが失われているようです。私はコメントLINE Aを削除した場合、すべてが正常に動作しBeginInvoke、EndInvokeでのマルチスレッドの問題?

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... 
    } 
} 

、何のアドバイスは失われませんしまっ:
は、私は次のように問題を軽減しました。すべてのアドバイスが記録されています。
BeginInvokeを有効にした後、しばらくしてからDdeClientAdvise -Methodが呼び出されていないときは、それ以上のログエントリはありません。

私はBeginInvoke、EndInvokeで何が間違っていますか?

編集:クラスに関する情報を追加してください。

+0

達成しようとしていることは、別のスレッドにログインして処理をアドバイスしてください。 – sll

+0

DdeClientAdvise関数は、提供されたコードのスタックの上にあります.DdeClientAdvise関数の呼び出し元は誰ですか? – Tigran

+0

デリゲートがこのようなコードでガベージコレクションを取得しているというのは良いことです。スニペットからどちらが表示されているのかを見ることはできません。 GCを早期に強制するためにGC.Collect()を使用してこの理論をテストします。デリゲートインスタンスをクラスのフィールドに格納して修復します。 –

答えて

0

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

0

DdeClientAdviseCallback内でEndInvokeに電話する必要はありませんか?

関連する問題