簡體   English   中英

訪問另一個線程創建的對象,而不必每次都調用?

[英]Access object created by another thread without invoking every time?

我有一個簡單的狀態標簽,在長時間運行的例程中經常更新。 該例程位於計時器上,因此位於另一個線程上,因此我得到了Cross-thread operation not valid錯誤。 我找到了一個SO修復程序,看起來像這樣:

lblQuery1Status.Invoke(new Action(delegate
{
    lblQuery1Status.Text = "Status: Publishing";
}));

但是,我在例行程序中將此控件的文本更新了7或8次。 有沒有更有效或更簡單的方法來做到這一點?

如果要“簡化”語法,則始終可以使用內聯lambda來“縮短”語法:

lblQuery1Status.Invoke(new Action(() => lblQuery1Status.Text = "Status: Publishing"));

您還可以為調用創建操作變量,並在需要時重新調用該操作:

Action updateStatus = () => 
    lblQuery1Status.Invoke(new Action(() => lblQuery1Status.Text = "Status: Publishing"));

然后,您可以根據需要多次調用它作為一種方法:

updateStatus();

這是我根據@David L上述回答 得出的解決方案。

動作定義:

Action<string> updateStatus = (s) => 
     statusLabel[qo.id].Invoke(new Action(() => statusLabel[qo.id].Text = s));

呼叫:

updateStatus("Opening Connection");

我意識到它不再高效,但是它更加簡單和整潔,這使我不那么害怕。

不幸的是,這是從長時間運行的任務/線程向UI線程獲取數據的最佳方法,編組有其開銷,但除非您每秒調用數百次,否則我認為會很好的😊

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM