2011-05-17 47 views
2

我試圖在C#中處理線程,但我發生在一個奇怪的異常我不知道如何解決。我已經通過了BackgroundWorker的方法運行,其中有這段代碼:Dispatcher.Invoke和線程訪問的問題

GridView gridView; 
DataView dataView; 

queryTable.GetViewAndDataView(out gridView, out dataView); 

this.listView.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(
    delegate() { 
     listViewView = gridView;      
     listView.ItemsSource = dataView; 
    } 
)); 

GetViewAndDataView填補了GridView和數據視圖,同時委託代碼設置當前的ListView。 Invoke的使用應該不會引發異常,但是當我嘗試運行它時,我得到了以下結果:調用線程無法訪問此對象,因爲其他線程擁有它

任何人都知道要處理這種異常,或者至少,如何禁用線程對象擁有?

+0

GridView和DataView究竟是什麼?是/有GridView控件? – 2011-05-17 11:59:39

+0

GridView和DataView UI組件,還是您自己的類? – 2011-05-17 11:59:56

+0

是的,GridView是一個UI組件,它似乎 – Archedius 2011-05-17 12:48:11

回答

5

該消息是正確的,你不能在後臺線程上創建控件並在UI線程中使用它們。你必須在UI線程上創建和分配它們。我建議首先在後臺線程中加載數據,然後在UI中執行其餘工作。線程

+0

謝謝,我已經改變了我的代碼結構反映你的意見,現在都運行良好! :) – Archedius 2011-05-17 12:48:50

2

在運行並行線程之前,您需要將this.listView.Dispatcher保存到某個局部變量中。在這裏你必須使用這個變量的調度器。

但是@Polity is right - 您必須在UI線程上創建控件/元素。在並行線程中,您只能創建非UI對象。