从其他线程获取列表框项:跨线程操作无效

本文关键字:线程 操作 无效 其他 获取 列表 | 更新日期: 2023-09-27 18:36:21

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

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

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

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

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

从其他线程获取列表框项:跨线程操作无效

您可以类似地使用 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

您需要对 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
    }
});