c# - 具有 BindingList<T> 和 DataGridView 的多线程 C# 应用程序

标签 c# multithreading winforms datagridview

我有公共(public)静态类MyGlobals用于我的应用程序范围变量以及处理和更改这些变量的多个线程。

public static class MyGlobals
{
    public static BindingList<Device> devicesList;
    public static BindingList<Device> availableList;
    public static object listLock = new object();
}

我有一个 Timer 线程,用于更新部分列表(例如 Device.status 字段)以及这些列表绑定(bind)到 DataGridView 的 UI 线程 表和某些字段(例如 Device.description 字段)可以在那里手动编辑。

我的问题是,当计时器线程想要更​​新绑定(bind)列表内容时,我得到 InvalidOperationException:

Additional information: Cross-thread operation not valid: Control 'gridView1' accessed from a thread other than the thread it was created on.

我在修改 MyGlogals 列表的每个代码块周围使用 lock(listLock) 语句,但我无法控制 DataGridView 处理列表的方式。如何使这个应用程序线程安全?

最佳答案

GUI本身需要从GUI线程(主线程)进行更新。 .NET 提供 BackgroundWorker类就是为了这个目的。与 GUI 的通信可以通过 ProgressChanged 来完成和 RunWorkerCompleted事件,您可以在其中传递选择的对象(例如要显示的对象)。

关于c# - 具有 BindingList<T> 和 DataGridView 的多线程 C# 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18759376/

相关文章:

c# - 在c#中组织文件路径

C# 将两个列表合并为一个列表,如 Enumerable.ConvertAll

c# - 确保 Singleton 只调用数据库查询一次

c# - ThreadPool 和带有 while(true) 循环的方法?

performance - 为什么多线程文件传输可以提高性能?

c# - 如何将一个文本文件的内容以更短的长度复制到另一个文本文件?

c# - 区域 - 日期和时间问题

winforms - 带有颜色编码的 vb.net/C# 代码编辑器

c++ - 为什么线程本地存储没有用页表映射实现?

multithreading - 通过 block 完成在后台查找对象