我有一個Windows窗體用戶控件,它包含第三方圖像顯示控件,它使用BeginInvoke委託調用從單獨的線程更新。在CPU負載過重的情況下發生跨線程BeginInvoke阻塞
在CPU負載過重的情況下,UI鎖定。當我附加一個調試器時,它總是在它更新第三方圖像控件的同一行代碼中。
public ICogImage DisplayImage
{
get { return this.ResultImageCogDisplay.Image; }
set
{
this.BeginInvoke((ThreadStart)delegate
{
this.ResultImageCogDisplay.Image = value;
});
}
}
如果我註釋掉setter的實現,那麼問題就會消失。
任何人都可以解釋爲什麼會發生這種情況嗎?
一些更多的信息:
- 更新事件週期性地生成的圖像(〜200毫秒)從一個幀捕獲卡。事件在單獨的線程中引發。
- 我相信第三方圖像控件使用ActiveX,它是康耐視視覺處理框架的一部分。
- 圖像是大約。 900x800 8位灰度
- 窗體上有4個這些控件,每個控件從不同的圖像的不同線程餵食。
- 我試過了,沒有IsInvokeRequired()檢查,它似乎沒有任何區別。
PostMessage隊列上的消息數量是否有限制?我在高CPU負載下遇到了什麼限制?
是否有可能找到這個隊列上的消息數量,只是爲了證明其原因?圖像數據量我會在隊列中張貼是一個因素(我可以縮小圖像)。不幸的是,應用程序必須顯示圖像作爲其用於手工製作的QA製作過程。 – canice 2012-08-14 23:10:11
數據量,數據處理速度等等。是UI線程能否跟上的一個因素。我不認爲有一種方法可以證明它,但是如果數據和數據緩解了問題,那麼限制數量會告訴你很多。 – 2012-08-15 00:27:14
嘗試在發佈代碼時將'Console.WriteLine'發佈到捕獲DateTime.Now'的UI線程,並從代碼實際執行的'DateTime.Now'中減去它。然後,您可以確定UI線程正在經歷的近似延遲。如果你需要它更準確,那就試試用'StopWatch'。 – Enigmativity 2012-08-15 02:56:29