【问题标题】:TaskWrapper - threading and delegate confusionTaskWrapper - 线程和委托混淆
【发布时间】:2012-06-08 23:20:40
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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);
    

    ...启动一个异步运行的线程并传递在您放置 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 中方法中的任何内容。

    【讨论】:

    • 这里也只是猜测,但等待状态不是“无”可能意味着等到任务实际开始(即它已被安排到底层线程。)
    • 非常感谢您的帮助 :) 我相信您是正确的,因为这可以在原始线程中完成。 +1 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多