任务包装器 - 线程和委托混淆
本文关键字:线程 包装 任务 | 更新日期: 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 的方法中的任何内容。