TaskWrapper - 线程化和委托混淆

时间:2012-06-04 21:50:02

标签: c# .net multithreading .net-3.5

有人可以向我解释一下这段代码,这样我就能更准确地掌握其中的内容吗?

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 个答案:

答案 0 :(得分: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是什么实例,都无法确定发生了什么。

在第一次检查时,如果代码正在执行我上面已经猜到的那样,没有必要让另一个线程来完成工作而没有任何关注while循环!整个事情可以被调用Run。中的方法中的任何内容替换。

相关问题