线程就绪和已完成的事件

时间:2011-01-30 14:18:19

标签: c# multithreading events

我需要在线程开始执行代码之前和执行完成之后在特定应用程序域中运行的每个线程中执行一些代码(无论它是如何生成的)。

我发现 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.Thread System.AppDomain 类上看到此类事件。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您需要在DoWork开始时/之前举办活动。

事件模型没有提供此功能,因为您可以轻松调用方法

  • 在RunWorkerAsync之前,来自调用线程
  • 从工作线程开始的DoWork开始。

所以没有明确的案例可以说明这样的事件。

答案 1 :(得分:1)

有许多不同的方法可以启动新线程。线程池不仅由QueueUserWorkItemBackgroundWorker使用,而且还由执行异步委托调用的任何代码使用。此外,Begin...End...方法用于执行异步操作,如Stream.BeginReadStream.EndRead开始和结束线程。当然,使用托管线程时还有标准Thread.Start()。然后是任务并行库。 。

当然,有很多方法可以直接使用Windows API启动线程。

即使您忽略了Windows API的可能性,您仍然要求挂钩许多不同的机制,以便您可以监视活动。您必须挂钩托管线程函数以及启动和关闭工作项的线程池函数。

如果没有对运行时库进行严重的探讨并在非托管代码中执行各种令人讨厌的未记录的事情,则可能无法解决此问题。即便如此,我也不相信它可以做到。你需要的钩子不会露出来。

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