我有一個客戶端應用程序,顯示實時值。這些值是通過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?
編輯:添加一些關於該類的更多信息。
你試圖實現什麼,加快建議通過移出日誌到單獨的線程處理? – sll
DdeClientAdvise函數位於提供的代碼堆棧的頂部,誰是DdeClientAdvise函數的調用者? – Tigran
賠率很好,代表正在用這樣的代碼收集垃圾。無法看到片段中的哪一個。通過使用GC.Collect()來儘早強制GC來測試該理論。通過將委託實例存儲在類的字段中進行修復。 –