从其他线程获取listboxitems:跨线程操作无效

时间:2012-06-04 11:03:09

标签: c#

到目前为止,我已经看过1000个使用Invoke方法从不同线程设置列表框对象中的项目的示例。

但是,我找不到任何有关如何从后台工作人员阅读列表框中的项目的解决方案。如何在读取SelectedItems之前调用它,例如......

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

在后台工作程序中运行的上述代码生成了以下错误:

跨线程操作无效:控制'CheckedListBox1'从其创建的线程以外的线程访问。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
    }
});