非UI“调用线程无法访问此对象,因为不同的线程拥有它”

时间:2014-03-05 23:43:06

标签: c# .net wpf

我有以下代码:

var queue = printer.PrintQueue;
var canPrint = ! Dispatcher.CurrentDispatcher.Invoke(()
                            => queue.IsPaperJammed || queue.IsOutOfPaper || 
                               queue.IsInError || queue.HasPaperProblem);

抛出以下错误:

  

调用线程无法访问此对象,因为另一个线程拥有它

我在UI线程上尝试了这个(使用如上所示的调度程序),我在当前线程上尝试了它(没有调度程序)。

有没有办法让对象询问哪个线程拥有它?

3 个答案:

答案 0 :(得分:4)

你没有CurrentDispatcher试过吗? :

var canPrint = ! Application.Current.Dispatcher.Invoke(()
                            => queue.IsPaperJammed || queue.IsOutOfPaper || 
                               queue.IsInError || queue.HasPaperProblem);

CurrentDispatcher.Invoke()将从当前正在执行的线程调用您的代码,它是非UI线程,假设此问题中的代码段是从非UI线程运行的。

参考文献:

答案 1 :(得分:0)

有一种方法可以确定CURRENT线程是否拥有控件:
使用control.Dispatcher.CheckAccess()检查当前线程是否拥有该控件。如果它不拥有它,那么Invoke Action使用调度程序。

答案 2 :(得分:0)

只是疯了,下面的代码不起作用,它仍然抛出异常

dlg.PrintTicket.PageMediaSize = new PageMediaSize(302.36220472, int.MaxValue);
dlg.PrintTicket.PageOrientation = PageOrientation.Portrait;

但是此代码有效

dlg.PrintTicket = new PrintTicket()
{
    PageMediaSize = new PageMediaSize(273, int.MaxValue),
    PageOrientation = PageOrientation.Portrait,
};

当然这两个代码必须在Application.Current.Dispatcher.Invoke(() => {})但是第一个会抛出异常,第二个代码会解决问题