如果不知道 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);
...启动一个异步运行的线程并传递在您放置 cmets 的部分中指定的方法。这可能是通过创建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 中方法中的任何内容。