首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调度器PushFrame()

调度器PushFrame()
EN

Stack Overflow用户
提问于 2010-04-19 04:28:25
回答 2查看 6.3K关注 0票数 1

我试图从几个不同的线程调用Dispatcher.PushFrame(),但是遇到了一个错误:

必须在与DependencyObject相同的线程上创建DependencySource。

下面是一个代码片段:

代码语言:javascript
复制
_lockFrame = new DispatcherFrame(true);
Dispatcher.PushFrame(_lockFrame);

当我试着:

代码语言:javascript
复制
Dispatcher.CurrentDispatcher.Invoke(
    DispatcherPriority.Normal,
    new Action(() => _lockFrame = new DispatcherFrame(true));
Dispatcher.PushFrame(_lockFrame);

我知道错误:

对象必须由同一个线程创建。

从不同线程将多个帧推入调度程序的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-19 05:04:32

每个线程都有自己的dispatcher对象--由Dispatcher.CurrentDispatcher返回。

方法是通过在UI线程上调用上面的方法来缓存目标dispatcher对象一次。然后像使用_cachedObj.Invoke一样使用它--将其封送到正确的线程。

WPF UI具有‘线程关联’- UI只能由创建它的线程访问。

更新:不确定你想要实现什么。但下面的代码片段对我有用。

代码语言:javascript
复制
    private Dispatcher _dispatcher;
    private DispatcherFrame _lockFrame;
    public Window1()
    {
        InitializeComponent();

        _dispatcher = Dispatcher.CurrentDispatcher;

        // the other thread
        Thread t = new Thread(
            (ThreadStart)delegate
            {

                _dispatcher.Invoke(
                    (Action)delegate
                    {
                        var frame = CreateNewFrame();
                        Dispatcher.PushFrame(frame);
                    });
            });
        t.Start();
票数 2
EN

Stack Overflow用户

发布于 2010-04-19 06:29:44

在来自不同线程的同一个调度程序上调用PushFrame是没有意义的,您没有编写要解决的问题,但是基于PushFrame的解决方案可能是错误的。

Dispatcher对象负责对单个线程执行代码和调度事件,每个线程都有一个消息队列,这些消息由OS发送并包括鼠标单击之类的通知,dispatcher有一个循环来读取这个队列并调用适当的事件。

有时,您必须处理消息而不从方法返回到dispatcher循环,这方面的一个很好的例子是模态对话框,它响应用户输入(因此它们需要处理消息),而不中断调用它们的方法的控制流。

这就是PushFrame所做的--它在代码中运行dispatcher循环。

每个线程(可选)都有自己的消息队列,消息是特定于属于该线程的窗口和控件的,您不能从另一个线程处理线程的消息队列(Windows本身没有允许读取另一个线程消息的API )。

从另一个线程调用PushFrame无法工作,因为调用发生在错误的线程上,PushFrame本身必须在调度程序管理的同一个线程上调用,您不能在另一个线程上调用它,因为它试图在另一个线程上处理线程的消息。

在这里使用Invoke或BeginInvoke也没有意义,因为只有在dispatcher处理消息时才调用传递给这些方法的委托,如果分发者已经在处理消息,则不需要调用PushFrame来使其处理消息。

如果您问了另一个问题,描述您正在尝试做什么,这里的某个人也许可以帮助您,但是从不同的线程调用Dispatcher.PushFrame是行不通的。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2665191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档