我有以下代码:
var queue = printer.PrintQueue;
var canPrint = ! Dispatcher.CurrentDispatcher.Invoke(()
=> queue.IsPaperJammed || queue.IsOutOfPaper ||
queue.IsInError || queue.HasPaperProblem);
抛出以下错误:
调用线程无法访问此对象,因为另一个线程拥有它
我在UI线程上尝试了这个(使用如上所示的调度程序),我在当前线程上尝试了它(没有调度程序)。
有没有办法让对象询问哪个线程拥有它?
答案 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(() => {})
但是第一个会抛出异常,第二个代码会解决问题