gpt4 book ai didi

.net - 从 DispatcherObject 继承

转载 作者:行者123 更新时间:2023-12-03 13:17:52 25 4
gpt4 key购买 nike

我想创建 DispatcherObject 的子类使用消息队列创建我自己的线程关联对象,就像 WPF 用于 UI 元素一样。

我有一个运行没有崩溃的测试应用程序,但 DispatcherObject 似乎没有处理它的消息队列。我刚刚创建了一个新的空白 WPF 应用程序并将此代码添加到 MainWindow.xaml.cs :

public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();

DispatcherWorker worker = null;
ManualResetEventSlim latch = new ManualResetEventSlim(false);

new Thread(() => {
worker = new DispatcherWorker();
latch.Set();
}).Start();

latch.Wait();

// worker.Dispatcher.Thread is stopped by here... why?
worker.Dispatcher.BeginInvoke(new Action(() => {
// This code never executed
worker.DoWork(this);
}));
}
}

public class DispatcherWorker : DispatcherObject {

public void DoWork(MainWindow window) {
VerifyAccess();
window.Dispatcher.BeginInvoke(new Action(() => window.Background = Brushes.Black));
}
}
DoWork()方法永远不会执行,如果我在调用 BeginInvoke 之前放置一个断点,我看到 Dispatcher 的线程已停止。为什么停止了?我设置线程错误吗?

( This similar question 似乎有同样的问题,但接受的答案是在 GUI 应用程序中运行代码,这将有一个消息泵。但即使在 GUI 应用程序中运行,我也会遇到同样的问题。)

最佳答案

拥有 Dispatcher 的线程将需要“抽”Dispatcher .也就是说,需要告诉它处理通过 Dispatcher 排队的消息。 .为此,您使用 DispatcherFrame :

Dispatcher.PushFrame(new DispatcherFrame());

这应该在您设置闩锁后出现。该线程永远不会退出 - 它只会在该线程的调度程序上发送消息。如果您希望它具有退出条件,请参阅 DispatcherFrame 的文档。 Continue 属性(property)。

请注意,是否使用自定义 DispatcherWorker 无关紧要。类或其他一些内置的 WPF 类。如果没有东西抽 Dispatcher在该线程上,不会处理任何消息。

关于.net - 从 DispatcherObject 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8360529/

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