2012-06-04 46 views
0

有人可以解释一下这段代码给我一点,所以我有一个更确切地了解到底发生了什么?TaskWrapper - 线程和委托混淆

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对象创建的语法有点朦胧。

回答

1

那么它不知道什么是在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是否是实例,都无法确切知道发生了什么。

在第一次检查时,if该代码正在做我以上猜测的结果,没有意义让另一个线程来完成这项工作,没有任何一点有while循环!整个事情可以用Run中调用的方法中的任何东西来代替。

+0

也只是猜测在这里,但等待状态不是'无'可能意味着等待,直到任务实际开始(即它已被安排到一个底层线程)。 –

+0

非常感谢您的帮助:)我相信你是对的,这可能是在原始线程中完成的。 +1 :) –