在多線程應用中將會涉及不同的線程訪問同一控制項的問題,C#中禁止跨線程直接訪問控制項。某個控制項在被創建時就記下了是誰創建了它,即它的創建線程。如果從另一個線程調用該控制項,那麼必須使用控制項的 Invoke 方法來將調用封送現在調用它的線程。(Invoke方法是控制項的方法) 到底是哪個線程要使用該控制項呢?需 ...
在多線程應用中將會涉及不同的線程訪問同一控制項的問題,C#中禁止跨線程直接訪問控制項。某個控制項在被創建時就記下了是誰創建了它,即它的創建線程。如果從另一個線程調用該控制項,那麼必須使用控制項的 Invoke 方法來將調用封送現在調用它的線程。(Invoke方法是控制項的方法)
到底是哪個線程要使用該控制項呢?需要用InvokeRequired來詢問一下,如果當前調用線程不是控制項的創建線程,則為 true;否則為 false。
例子:
代碼段前提是lb是一個label控制項,在主線程創建(不用瞭解具體在哪個線程,反正和RunTimer不在一個線程),RunTimer方法是在另一個線程創建,這時候我們需要RunTimer方法調用主線程上的label控制項。
private delegate void RunTimeDelegate(); private void RunTime() { if (lb.InvokeRequired) { RunTimeDelegate d = RunTime; lb.Invoke(d);//Invoke方法是控制項的,這裡相當於把RunTime方法交於了委托d, //d中相當於把RunTimer方法從線程中提取出來放到委托中,此時控制項的Invoke方法就可以 // 調用委托中的和RunTimer相同方法,這樣控制項使用RunTimer方法就在控制項的線程中使用的。 } else { time = endTime - TimeSpan.Parse(DateTime.Now.ToString("HH:mm:ss")); lb.Text = time.ToString(); } }