2011-07-15 49 views
2

我有一個客戶端應用程序,顯示實時值。這些值是通過DDE-Advise提供的。這些實時值是數控機牀的移動軸。所以有大約100個建議每分鐘通過這個DdeClientAdvise進來 - 方法。
當應用程序獲得許多DDE-建議時,似乎突然間所有adivses都丟失了。
我這個問題化簡爲以下: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... 
    } 
} 

如果我刪除註釋行A,一切正常,沒有提醒迷路了。所有的建議都被記錄下來。
如果我啓用BeginInvoke,一段時間後DdeClientAdvise-方法不再被調用,不再有日誌條目。

我在做什麼錯誤的BeginInvoke,EndInvoke?

編輯:添加一些關於該類的更多信息。

+0

你試圖實現什麼,加快建議通過移出日誌到單獨的線程處理? – sll

+0

DdeClientAdvise函數位於提供的代碼堆棧的頂部,誰是DdeClientAdvise函數的調用者? – Tigran

+0

賠率很好,代表正在用這樣的代碼收集垃圾。無法看到片段中的哪一個。通過使用GC.Collect()來儘早強制GC來測試該理論。通過將委託實例存儲在類的字段中進行修復。 –

回答

0

看起來好像@Hans Passant是對的:代表正在收集垃圾。將代表存儲在一個字段中似乎解決了這個問題。
雖然我改變了整個項目的設計。所以我不能肯定地說,這解決了這個問題。

0

你不需要在DdeClientAdviseCallback中調用EndInvoke嗎?