代码之家  ›  专栏  ›  技术社区  ›  Tri Q Tran

wpf-调度程序pushframe()

  •  1
  • Tri Q Tran  · 技术社区  · 16 年前

    我试图从几个不同的线程调用dispatcher.pushFrame(),但遇到错误:

    必须在其上创建DependencySource 线程作为DependencyObject。

    下面是一段代码:

    _lockFrame = new DispatcherFrame(true);
    Dispatcher.PushFrame(_lockFrame);
    

    当我试图:

    Dispatcher.CurrentDispatcher.Invoke(
        DispatcherPriority.Normal,
        new Action(() => _lockFrame = new DispatcherFrame(true));
    Dispatcher.PushFrame(_lockFrame);
    

    我知道错误:

    对象必须由 线程。

    从不同的线程将多个帧推入分派器的方法是什么?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Gishu    16 年前

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

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

    wpf ui具有“线程关联性”-ui只能由创建它的线程访问。

    更新:不确定你想达到什么目标。但是下面的代码片段对我有效。

        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
  •  15
  •   Nir    16 年前

    从不同的线程在同一个调度程序上调用pushframe是没有意义的,你没有写下你想要解决的问题,但是基于pushframe的解决方案可能是错误的。

    Dispatcher对象负责为单个线程执行代码和分派事件,每个线程都有一个由操作系统发送的消息队列,其中包括鼠标单击之类的通知,Dispatcher有一个读取此队列并调用相应事件的循环。

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

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

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

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

    在这里使用invoke或begininvoke也没有意义,因为传递给这些方法的委托仅在Dispatcher处理消息时才被调用,如果Dispatcher已经在处理消息,则无需调用pushFrame使其处理消息。

    如果你问另一个问题描述你想做什么,这里的人可能会帮助你,但是从不同线程调用dispatcher.pushframe永远不会起作用。