调度器如何处理线程?

3
我们有一个使用调度程序的Silverlight应用程序,我希望您能帮忙解释以下代码的含义(不幸的是编写代码的开发人员已经离开)。
我们的代码如下:
public class ABC
{
    private Dispatcher dispatcher;
    private Thread threadRunner;

    public void ABC()
    {
       threadRunner= new Thread(ThreadRunnerMethod)
                         {
                           IsBackground = true, 
                           ApartmentState = ApartmentState.STA
                         };
       threadRunner.Start();
    }

    private static void ThreadRunnerMethod()
    {
       Dispatcher.Run();
    }


    public void MainMethod()
    {
       dispatcher = Dispatcher.FromThread(threadRunner);
       dispatcher.Invoke(new Action(() => 
                                     // "DO SOME WORK WITH A COM OBJECT"
                                      ));

    }
}

我有一些线程的基本经验,但我不知道这一切是如何工作的?

JD

1个回答

3
这相当于Windows Forms中的Control.Invoke,基本上它只是被分离为自己的对象。
据我理解,Dispatcher.Run将基本上启动一个事件循环,并且您可以使用Dispatcher.Invoke将调用传递到该事件循环中。Dispatcher.FromThread找到负责给定线程的Dispatcher对象 - 因此在这种情况下,它会找到在新线程中运行的事件循环。
因此,在您的代码中,使用lambda表达式创建的委托将在新创建的线程中执行。

嗨Jon,感谢您的回复。对于Control.invoke(),如果我没记错的话,我们是在排队等待主线程执行任务吗?这里的任务是在新线程中完成的吗?另外,如果启动了另一个任务,它会简单地将其添加到新线程的队列中进行处理,而不会阻塞调用线程吗?谢谢。 - JD.
在这两种情况下,我们都将任务排队给“正在运行事件循环的线程”来执行。对于WinForms,这是UI线程 - 不一定是您的应用程序启动的线程。如果您调用Invoke,则会阻塞调用线程;而BeginInvoke则不会。 - Jon Skeet
非常感谢。现在清楚正在发生什么了。 我昨天订购了你的书,迫不及待想要阅读。 JD。 - JD.
@JD:很酷 - 希望你喜欢它! - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接