2

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

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

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

上面在后台工作人员中运行的代码产生了以下错误:

跨线程操作无效:控件“CheckedListBox1”从创建它的线程以外的线程访问。

4

2 回答 2

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

于 2012-06-04T11:06:46.010 回答
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
    }
});
于 2012-06-04T11:10:34.307 回答