我试图从几个不同的线程调用Dispatcher.PushFrame(),但是遇到了一个错误:
必须在与DependencyObject相同的线程上创建DependencySource。
下面是一个代码片段:
_lockFrame = new DispatcherFrame(true);
Dispatcher.PushFrame(_lockFrame);当我试着:
Dispatcher.CurrentDispatcher.Invoke(
DispatcherPriority.Normal,
new Action(() => _lockFrame = new DispatcherFrame(true));
Dispatcher.PushFrame(_lockFrame);我知道错误:
对象必须由同一个线程创建。
从不同线程将多个帧推入调度程序的方法是什么?
发布于 2010-04-19 05:04:32
每个线程都有自己的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();发布于 2010-04-19 06:29:44
在来自不同线程的同一个调度程序上调用PushFrame是没有意义的,您没有编写要解决的问题,但是基于PushFrame的解决方案可能是错误的。
Dispatcher对象负责对单个线程执行代码和调度事件,每个线程都有一个消息队列,这些消息由OS发送并包括鼠标单击之类的通知,dispatcher有一个循环来读取这个队列并调用适当的事件。
有时,您必须处理消息而不从方法返回到dispatcher循环,这方面的一个很好的例子是模态对话框,它响应用户输入(因此它们需要处理消息),而不中断调用它们的方法的控制流。
这就是PushFrame所做的--它在代码中运行dispatcher循环。
每个线程(可选)都有自己的消息队列,消息是特定于属于该线程的窗口和控件的,您不能从另一个线程处理线程的消息队列(Windows本身没有允许读取另一个线程消息的API )。
从另一个线程调用PushFrame无法工作,因为调用发生在错误的线程上,PushFrame本身必须在调度程序管理的同一个线程上调用,您不能在另一个线程上调用它,因为它试图在另一个线程上处理线程的消息。
在这里使用Invoke或BeginInvoke也没有意义,因为只有在dispatcher处理消息时才调用传递给这些方法的委托,如果分发者已经在处理消息,则不需要调用PushFrame来使其处理消息。
如果您问了另一个问题,描述您正在尝试做什么,这里的某个人也许可以帮助您,但是从不同的线程调用Dispatcher.PushFrame是行不通的。
https://stackoverflow.com/questions/2665191
复制相似问题