2011-03-11 58 views
0

我已經建立了一個WCF主機,它在一個對象的實例上運行。當從WCF客戶端調用以下方法時,會拋出錯誤「調用線程無法訪問此對象,因爲不同的線程擁有它」。調用線程不能訪問這個對象,因爲不同的線程擁有它

public List<PrintQueueData> getPrintQueues() 
{ 
    List<PrintQueueData> resultQueues = new List<PrintQueueData>(); 

    List<PrintQueue> queues = queueCollection; 

    foreach (PrintQueue q in queues) 
    { 
     // This throws an exception 
     resultQueues.Add(new PrintQueueData(q.HostingPrintServer.ToString(), q.Name)); 

     // This does NOT throw any exceptions 
     resultQueues.Add(new PrintQueueData("1", "2"); 
    } 

    return resultQueues; 
} 

我該怎麼辦才能糾正這個錯誤?

編輯:queueCollection是包含此方法的類的字段。

編輯:queueCollection是在這個類的開始處聲明的,它的類型是printqueue的列表,和它在這個方法中分配的相同。

編輯:我有一個計時器運行使用queueCollection,但是,我將Timer.Enabled設置爲false,錯誤仍然發生。

+0

「queueCollection」從哪裏來? – 2011-03-11 01:16:49

+0

您是在某處使用BackgroundWorker或線程嗎? – 2011-03-11 02:54:01

+0

我有一個定時器運行使用queueCollection,但是,我仍然收到錯誤後設置Timer.Enabled爲false。 – mike9182 2011-03-11 14:34:18

回答

0

你可以嘗試List<PrintQueue> queues = queueCollection.ToList();或沿着那條線。你想要達到的目的是快速創建queueCollection的副本。這應該減少隊列被某個其他線程'鎖定'並因此導致所述錯誤的機會。

或者,您可以嘗試在訪問queueCollection時使用同步。例如:

lock (wantMyQueue) 
{ 
    // Access queueCollection in here 
} 

其中wantMyQueue是一個簡單的object全局變量。

+0

謝謝,雖然這些建議都沒有奏效。 – mike9182 2011-03-11 02:47:54

+1

反正'queueCollection'是什麼數據類型? – 2011-03-11 03:02:45

+0

+1 - queueCollection是什麼類型?它在哪裏宣佈。你是否創建任何線程或背景工作者? – 2011-03-11 05:49:23

1

「PrintQueue」類型的行爲類似於「DependencyObject」。它綁定到當前線程的「Dispatcher」,類似於WPF中的UI元素。這就是你不能在與創建隊列的線程不同的線程上使用它。您必須緩存「PrintQueueData」對象(而不是「PrintQueue」對象)或在每個方法調用上實例化「PrintQueue」。

實際的異常來自「System.Print.PrintQueue.VerifyAccess()」所調用的「System.Windows.Threading.Dispatcher.VerifyAccess()」。只要您訪問打印隊列的屬性或方法,就會調用後者。

相關問題