gpt4 book ai didi

c# - 调度员 - 它是如何工作的?

转载 作者:可可西里 更新时间:2023-11-01 13:13:11 24 4
gpt4 key购买 nike

在阅读了 Dispatcher 类的文档后,我意识到它也可以用于非 UI 的操作队列。

那么 Dispatcher 类实际上是如何工作的呢?我知道,它的主要工作是将操作排队到特定线程 - 但它如何将这些操作“发送”到线程?线程如何“获取”这些操作?

我最好的猜测是每个线程都有某种“线程队列”,但我还是不知道。

最佳答案

让一个线程开始在另一个线程上执行代码并非易事。问题的症结在于,您不能简单地告诉任何线程在该线程已经启动后开始执行该方法。必须专门设置目标线程才能提前接收此类请求。

通常使用的模式是生产者-消费者。目标线程将围绕一个无限循环旋转,等待消息出现在阻塞队列中。队列被设计为阻塞直到队列中出现一个项目,从而防止目标线程不必要地消耗 CPU 时间。这是让线程接受委托(delegate)注入(inject)执行的一种非常简单的方法。

public class Example
{
private BlockingCollection<Action> queue = new BlockingCollection<Action>();

public Example()
{
new Thread(
() =>
{
while (true)
{
Action action = queue.Take();
action();
}
}).Start();
}

public void ExecuteAsync(Action action)
{
queue.Add(action);
}
}

现在,对于 UI 线程,它已经运行了一个消息循环,因此 Dispatcher 类可以简单地将一条特殊消息发布到包含要执行的委托(delegate)的消息队列中。在处理所有绘制、按钮点击等过程中,此特殊消息也会被 UI 线程拾取并开始执行委托(delegate)。

So how does the Dispatcher class actually works? I'm aware of that, it's main job is to queue actions to a specific thread - but how does it "send" those actions to the thread?

通过将委托(delegate)排队到目标线程监控的队列中。

And how do the thread "get" these actions?

通过运行一个无限循环来监控队列。队列通常是一种称为阻塞队列的特殊类型,如果队列为空,它会阻塞消费线程。

My best guess is that there's some kind of "thread queue" for each thread, but then again I've got no idea.

非常接近。除了线程实际上没有为此目的的内置队列。它必须手动设置。这就是为什么只有专门设计的线程才能接受委托(delegate)注入(inject)。 UI 线程是这样设置的,因为 Application.Run 创建了消息循环。在我的示例中,您将看到我必须使用 BlockingCollection 和无限循环才能使其在工作线程上工作。

关于c# - 调度员 - 它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8561986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com