2011-01-30 117 views
0

在線程開始執行代碼之前以及執行完成後,我在特定的應用程序域中運行每個線程(不管它是如何生成的)都需要執行一部分代碼。線程就緒和已完成事件

我發現System.ComponentModel.BackgroundWorker類具有與我需要的第二個相同的事件(請參閱表)。

 
┌───────────┬────────────────────────┬─────────────────────────────────────────────────────────────────────────┐ 
│ ? class │ BackgroundWorker class │ Description                │ 
├───────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────────┤ 
│ Ready  │ -      │ Operation execution is about to start.         │ 
├───────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────────┤ 
│ ?   │ DoWork     │ Execute operation.              │ 
├───────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────────┤ 
│ ?   │ ProgressChanged  │ Notify about progress in execution of operation.      │ 
├───────────┼────────────────────────┼─────────────────────────────────────────────────────────────────────────┤ 
│ Completed │ RunWorkerCompleted  │ Operation has completed, has been cancelled or has raised an exception. │ 
└───────────┴────────────────────────┴─────────────────────────────────────────────────────────────────────────┘ 

是否有活動,如就緒完成了從上表?我沒有在System.Threading.ThreadSystem.AppDomain類中看到這類事件。

回答

1

有很多不同的方法來開始新的線程。線程池不僅被QueueUserWorkItemBackgroundWorker使用,而且被任何執行異步委託調用的代碼使用。此外,Begin...End...用於執行異步事件的方法,如Stream.BeginReadStream.EndRead開始和結束線程。當然,使用託管線程時的標準爲Thread.Start()。然後是任務並行庫。 。 。

而且,當然,還有無數直接用Windows API啓動線程的方法。

即使您忽略了Windows API的可能性,您仍然要求掛鉤許多不同的機制,以便您可以監視活動。您必須掛接託管線程函數以及啓動和關閉工作項的線程池函數。

這個問題的一般解決方案可能是不可能的,如果沒有對運行時庫進行一些認真的探討,並且在非託管代碼中做所有非法的非法事件。即使那樣,我不相信它可以完成。您需要的鉤子不會暴露。

如果你想包括Windows API的可能性......好吧,祝你好運。

+0

不幸的是,你可能是對的。非常感謝您提供的信息。 – 2011-01-30 17:17:25

2

如果我理解正確,您需要在DoWork開始之前的事件。

事件模型不ptovide這一點,因爲你可以很容易地在馬上DoWork的從工作線程開始調用一個方法

  • 剛剛的RunWorkerAsync之前,從調用線程

所以沒有明確的情況下這樣的事件。

+0

我需要在任何線程的代碼執行之前和之後執行一部分代碼。您建議的解決方案並不完整,因爲線程可以在調用Thread.Start之後派生,用於任意委託調用,並且由ThreadPool執行通過QueueUserWorkItem方法調用排隊等待執行的方法。 – 2011-01-30 15:18:49