c# - WPF 中的调度程序与线程的关系

标签 c# .net wpf dispatcher

我并不完全清楚一个应用程序中有多少 Dispatcher,以及它们如何与 Threads 相关或从 Threads 引用。

据我了解,一个 WPF 应用程序有 2 个线程(一个用于输入,另一个用于 UI)和 1 个调度程序(与 UI 线程关联)。如果我创建另一个线程 - 让我们称之为“工作线程” - 当我在工作线程上调用 Dispatcher.CurrentDispatcher 时,我会得到哪个调度程序?

另一种情况: 假设一个控制台应用程序有 2 个线程——主线程和输入线程。在主线程上,我首先创建输入线程,然后调用 Application.Run()

Thread thread = new Thread(new ThreadStart(UserInputThreadFunction));
thread.Start();
Application.Run();

会有一个调度员,对吗?在输入线程上,Dispatcher.CurrentDispatcher 是否返回主线程的调度程序?或者将实例获取到主线程的调度程序的正确方法是什么?

难道一个 WPF 应用程序中有多个调度程序?在任何情况下,创建另一个调度程序是否有意义?

最佳答案

WPF application has 2 threads (one for input, the other for UI)

这种说法并不完全正确。 WPF 应用程序只有一个 UI 线程来处理所有 UI 交互和用户输入。还有一个负责渲染的“隐藏”线程,但通常开发人员不会处理它。

Dispatcher/Thread 关系是一对一的,即一个 Dispatcher 总是与一个线程相关联,并且可用于将执行调度到该线程。 Dispatcher.CurrentDispatcher 返回当前线程的调度程序,也就是说,当您在工作线程上调用 Dispatcher.CurrentDispatcher 时,您会获得该工作线程的调度程序。

调度程序是按需创建的,这意味着如果您访问 Dispatcher.CurrentDispatcher 并且没有与当前线程关联的调度程序,则会创建一个。

也就是说,应用程序中的调度程序数总是小于或等于应用程序中的线程数。

关于c# - WPF 中的调度程序与线程的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5015278/

相关文章:

.net - 验证密码的最小/最大长度

wpf - 为什么 "Setting event handlers inside a Setter.Value structure"会给出编译错误?

c# - 重新实现另一个接口(interface)已经继承的接口(interface)

c# - CLR 编译器优化示例

c# - 使用 NHibernate 为 Sql Server Identity 和 Oracle Sequence 映射实体

wpf - SnapsToDevicePixels 似乎在 StackPanel 中不起作用

wpf - 组合框样式

c# - Linq to SQL 有序子集合

c# - 在渲染页面中渲染页面

c# - 如何使用 C# 处理 CSV 文件中的换行符?