2014-03-05 48 views
3

我有以下代碼:非UI「因爲不同的線程擁有它調用線程不能訪問該對象」

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

它拋出以下錯誤:

The calling thread cannot access this object because a different thread owns it

我有在UI線程上嘗試了這一點(使用如上所示的調度程序),並且在當前線程(沒有調度程序)上嘗試了它。

有沒有辦法問一個對象哪個線程擁有它?

+0

有一種方法,以確定是否需要Dispatcher.Invoke。這會回答你的問題嗎? – BradleyDotNET

+0

@LordTakkera - 我不確定會這樣,因爲我使用Dispatcher嘗試它,並且出錯,並且兩次都出現同樣的錯誤。我的猜測是,那裏有一個不同的擁有線程。 – Vaccano

+1

什麼是創建'打印機'?我不認爲你可以很容易地找出哪個線程擁有一個對象,但也許我們可以找出哪一個是。 – vcsjones

回答

4

您嘗試過沒有CurrentDispatcher嗎? :

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

CurrentDispatcher.Invoke()會從線程當前執行調用你的代碼,它是非UI線程假設這個疑問,段來自非UI線程中運行。

參考文獻:

+1

這工作!謝謝! – Vaccano

0

有一種方法可以確定CURRENT線程是否擁有一個控件: 使用control.Dispatcher.CheckAccess()檢查當前線程是否擁有該控件。如果它不擁有它,則使用調度程序調用一個操作。

+0

'System.Printing.PrintQueue'沒有Disptacher成員(我可以找到)。 – Vaccano

相關問題