【问题标题】:Thread Ready and Completed Events线程就绪和完成事件
【发布时间】:2011-01-30 23:48:58
【问题描述】:

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

我发现 System.ComponentModel.BackgroundWorker 类的事件与我需要的第二个事件相同(见表格)。

┌────────────┬────────────────────────┬──────────── ────────────────────────────────────────────────── ────────────┐ │ ?类 │ BackgroundWorker 类 │ 描述 │ ├────────────┼────────────────────────┼──────────── ────────────────────────────────────────────────── ────────────┤ │ Ready │ - │ 操作执行即将开始。 │ ├────────────┼────────────────────────┼──────────── ────────────────────────────────────────────────── ────────────┤ │ ? │ DoWork │ 执行操作。 │ ├────────────┼────────────────────────┼──────────── ────────────────────────────────────────────────── ────────────┤ │ ? │ ProgressChanged │ 通知操作执行进度。 │ ├────────────┼────────────────────────┼──────────── ────────────────────────────────────────────────── ────────────┤ │ 已完成 │ RunWorkerCompleted │ 操作已完成、已取消或已引发异常。 │ └────────────┴────────────────────────┴──────────── ────────────────────────────────────────────────── ────────────┘

是否存在上表中的 ReadyCompleted 等事件?我在 System.Threading.ThreadSystem.AppDomain 类上都没有看到此类事件。

【问题讨论】:

    标签: c# multithreading events


    【解决方案1】:

    如果我理解正确,您希望在 DoWork 开始时/之前举办一个活动。

    事件模型不提供这一点,因为您可以轻松调用方法

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

    因此,此类事件没有明确的案例。

    【讨论】:

    • 我需要在任何线程执行代码之前和之后执行部分代码。您建议的解决方案并不完整,因为可以在调用 Thread.Start 后生成线程,用于任意委托调用,并由 ThreadPool 执行排队等待通过 QueueUserWorkItem 方法调用执行的方法。
    【解决方案2】:

    有许多不同的方式来启动新线程。线程池不仅被QueueUserWorkItemBackgroundWorker 使用,还被任何执行异步委托调用的代码使用。此外,Begin...End... 方法用于执行异步操作,例如 Stream.BeginReadStream.EndRead 启动和结束线程。当然,使用托管线程时还有标准的Thread.Start()。然后是 Task Parallel Library 。 . .

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

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

    如果不认真研究运行时库并在非托管代码中执行各种令人讨厌的未记录的事情,则可能无法解决此问题。即使那样,我也不相信它可以做到。你需要的钩子没有暴露出来。

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

    【讨论】:

    • 不幸的是,您可能是对的。非常感谢您提供的信息。
    猜你喜欢
    • 2011-03-11
    • 2016-05-31
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2020-05-30
    • 1970-01-01
    • 2016-12-03
    相关资源
    最近更新 更多