【发布时间】:2014-03-05 23:43:05
【问题描述】:
我有以下代码:
var queue = printer.PrintQueue;
var canPrint = ! Dispatcher.CurrentDispatcher.Invoke(()
=> queue.IsPaperJammed || queue.IsOutOfPaper ||
queue.IsInError || queue.HasPaperProblem);
它抛出以下错误:
调用线程无法访问此对象,因为不同的线程拥有它
我已经在 UI 线程上尝试过(使用如上所示的调度程序),我已经在当前线程上尝试过(没有调度程序)。
有没有办法询问对象是哪个线程拥有它?
【问题讨论】:
-
有一种方法可以确定是否需要 Dispatcher.Invoke。这会回答你的问题吗?
-
@LordTakkera - 我不确定它会不会,因为我在 Dispatcher 和 out 的情况下尝试它,但两次都失败并出现相同的错误。我的猜测是那里有一个不同的拥有线程。
-
什么在创建
printer?我不认为你可以很容易地弄清楚哪个线程拥有一个对象,但也许我们可以弄清楚哪个是。 -
我相信您对调度员的调用会启动一个线程。 (因此,尝试使用您的队列的线程与创建它的线程是不同的线程。)我建议将队列的创建移到调用线程内部,或者将错误条件的测试移到调用之前.您正在尝试做的事情的更大样本可能会有所帮助。 (小样本没有说明为什么在这种情况下甚至会调用多线程。)
-
我认为你问错了问题。真正的问题在于,您为什么要尝试将由不同 Dispatcher 创建的对象访问到另一个不同的 Dispatcher?