带BindingList的多线程C#应用程序<;T>;和DataGridView
我有带BindingList的多线程C#应用程序<;T>;和DataGridView,c#,multithreading,winforms,datagridview,C#,Multithreading,Winforms,Datagridview,我有公共静态类MyGlobals,用于处理和更改应用程序范围的变量和多线程 public static class MyGlobals { public static BindingList<Device> devicesList; public static BindingList<Device> availableList; public static object listLock = new object(); } 我在修改MyGloga
公共静态类MyGlobals
,用于处理和更改应用程序范围的变量和多线程
public static class MyGlobals
{
public static BindingList<Device> devicesList;
public static BindingList<Device> availableList;
public static object listLock = new object();
}
我在修改
MyGlogals
列表的每个代码块周围使用lock(listLock)
语句,但我无法控制DataGridView
如何处理列表。如何使此应用程序线程安全?您不能从其他线程更新UI线程
您可以使用来帮助您解决此问题:
比如你
foreach (Device device in MyGlobals.devicesList)
{
Invoke(new MethodInvoker(delegate {
device.text = "newText";
}));
}
或使用:
在bg_DoWork中:
void bg_DoWork(object sender, DoWorkEventArgs e)
{
foreach (Device device in MyGlobals.devicesList)
{
device.text = "newText";
}
}
GUI本身需要从GUI线程(主线程)更新。NET提供的类正是为了这个目的。与GUI的通信可以通过/或和事件完成,在这些事件中,您可以传递选择的对象(例如要显示的对象)。没有办法告诉DataGridView数据源处理程序使用与我的计时器线程相同的锁?性能不是问题。@ainla不太确定如何回答这个问题。。。我想这没有关系。c#不允许您从不同的线程更改UI,这就是为什么会出现异常…所以有一种方法可以做到这一点。。。将是在UI线程中仅为DataGridView数据源使用单独的绑定列表,然后让UI线程在执行此操作时使用lock(MyGlobals.listLock)语句定期将其列表内容与MyGlobals.DeviceList内容同步?@ainla是的,但您不必。。。Invoke and BackgroundWorker的全部要点是,如果某些内容发生了更改,您不必每隔500个左右进行一次检查。你可以告诉用户界面“嘿,我改变了什么,拿去吧”
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(bg_DoWork);
bg.RunWorkerAsync();
void bg_DoWork(object sender, DoWorkEventArgs e)
{
foreach (Device device in MyGlobals.devicesList)
{
device.text = "newText";
}
}