2011-03-19 42 views
2

我的主題:如何在使用線程池時告訴線程何時完成?

public void main_news_thread(MainApplication main) 
{ 
    ThreadPool.QueueUserWorkItem(p => check_news(validrsslist, 0)); 
} 

我把這個線程的時間間隔每...

我怎麼能知道當線程完成,所以我可以調用的處理GUI其他兩種方法?我怎樣才能引用這個線程池線程?

回答

4

既然你在談論UI,你可能想看看的BackgroundWorker ,它提供了UI線程上觸發一個RunWorkerCompleted事件,並指示成功/失敗/取消等

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker_events.aspx

就個人而言,雖然,我只是跑我的工作者代碼結束時的回調方法(記住切換回UI線程,通過WPF中的Dispatcher.Invoke或winforms中的this.Invoke)。

+0

+1'BackgroundWorker'是線程池的一個包裝。它提供了他必須手動編寫的所有代碼。異步委託也安排在線程池上工作。換句話說:不要直接使用'ThreadPool'。使用一個包含線程池的對象來提供有用的額外功能,例如「完成」回調。 – 2011-03-19 14:43:46

1

可以執行的線程本身(你要調用自己進入GUI線程的照顧)的方法:

ThreadPool.QueueUserWorkItem(p => { 
            check_news(validrsslist, 0); 
            //do something after the task is finished 
            }); 
+0

這就是問題如何訪問GUI線程或更改此線程的任何控件?也許我可以從主線程調用一個方法(以某種方式告訴這個新線程調用主線程的方法?) – 2011-03-19 10:40:06

+0

使用Form.Invoke()在UI線程上運行代碼。 – 2012-05-09 05:41:50