2012-06-04 76 views
2

到目前爲止,我已經見過1000個示例如何使用Invoke方法從不同線程設置列表框對象中的項目。從其他線程獲取listboxitems:跨線程操作無效

但是,我無法找到任何解決方案,如何簡單地從後臺工作人員踩到列表框中的項目。如何閱讀例如SelectedItems之前調用此...

foreach (var item in CheckedListBox1.SelectedItems) 
{ 
//Do something 
} 

上面在後臺工作運行的代碼生成以下錯誤:

跨線程操作無效:控制「CheckedListBox1」從訪問一個線程,而不是它創建的線程。

回答

1

您同樣可以使用Invoke讀取從後臺線程 UI元素:

var selectedItems = (IList)this.Invoke(new Func<IList>(() => 
    CheckedListBox1.SelectedItems.Cast<object>().ToList())); 

foreach (var item in selectedItems) 
{ 
    //Do something 
} 

如果你知道你的項目的類型,你可以指定在Cast呼叫類型,並返回IList<YourType>而不是非通用的IList

+0

tnx ..但它會給我以下錯誤:System.Data.EnumerableRowCollectionExtensions.Cast (System.Data.EnumerableRowCollection)'是一個'方法',它在給定的上下文中無效。它給這個演員 Wesman80

+0

@ user1434880:我的歉意,我錯過了'演員'後面的圓括號。嘗試使用更新的代碼。 – User3810621

+0

Perfect .. That works ..(最後只有一個缺失的括號) – Wesman80

1

您將需要對UI對象的引用。然後,當您沒有參考時,您可以使用此代碼(.NET 4.0)調用主線程上的內容,因爲您可以使用主線程上的Application.Current指針:

Application.Current.Dispatcher.BeginInvoke((ThreadStart)delegate 
{ 
    // TODO: Implement task to do on main thread 
    foreach (var item in CheckedListBox1.SelectedItems) 
    { 
     //Do something 
    } 
});