任务包装器 - 线程和委托混淆

本文关键字:线程 包装 任务 | 更新日期: 2023-09-27 18:36:19

有人可以向我解释一下这段代码,以便我更牢固地掌握其中发生了什么吗?

taskWrapper = XTThreadPool.DEFAULT_POOL.Run((System.Threading.ThreadStart)delegate()
{
    //Remote procedure execution and result processing code.
    //Some vars set in here are used after the Join() below.
}, true, true);
while (taskWrapper.Status == XTThreadPool.Task.STATUS.None)
{
    System.Threading.Thread.Sleep(10);
}
...
taskWrapper.Join();

在我看来,它看起来像正在创建一个单独的线程,并且在其中使用了远程过程调用。 不过,我对委托的使用或 taskWrapper 对象创建的语法有点模糊。

任务包装器 - 线程和委托混淆

好吧,不知道 XTThreadPool 类中的内容有点棘手,但你可以猜一猜......

很有可能这第一点...

taskWrapper = XTThreadPool.DEFAULT_POOL.Run((System.Threading.ThreadStart)delegate()
{
    //Remote procedure execution and result processing code.
    //Some vars set in here are used after the Join() below.
}, true, true);

。启动异步运行的线程,并传递在放置注释的部分中指定的方法。这可能是通过创建 Thread 的实例来实现的,该实例将方法作为委托传递给其构造函数,并调用 newThread.Start() ,这将在应用程序线程池内的新线程上开始执行。然后,可以使用线程引用来检查该线程的状态,并查看它是否已完成,这可能是本节的作用:

while (taskWrapper.Status == XTThreadPool.Task.STATUS.None)
{
    System.Threading.Thread.Sleep(10);
}

这对我来说似乎有点奇怪。 System.Threading.Thread访问当前线程,而不是线程池启动的线程,Sleep 方法只是表示"不执行任何操作"。因此,当前线程正在等待由 taskWrapper 实例启动的线程进入 None 以外的状态。现在这就是困难的地方,因为我们真的不知道taskWrapper在做什么。

实际上它可能只是在等待线程完成执行,但是使用单独的线程就没有意义了,因为工作也可以代替上面的while循环来完成。

然后这个:

taskWrapper.Join();

上面的行真的可以做任何事情,就像我说的那样,这取决于任何taskWrapper的实现。但是根据名称,我猜它使用了Thread.Join方法,这基本上导致调用线程(此线程)等待,直到调用它的线程(taskWrapper)完成。然而,taskWrapper 本身实际上并不是一个线程(基于对上面 Status 属性值的检查),更可能它只是线程周围的一个包装器。

老实说,我已经完全猜到了,它真的可以做任何事情。如果没有看到 XTThreadPool 类的代码以及任何DEFAULT_POOL实例,就不可能确定发生了什么。

在第一次检查时,如果代码正在执行我上面猜测的事情,那么让另一个线程来完成工作是没有意义的,而使用 while 循环也没有意义!整个事情可以替换为调用 Run 的方法中的任何内容。