Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带BindingList的多线程C#应用程序<;T>;和DataGridView_C#_Multithreading_Winforms_Datagridview - Fatal编程技术网

带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";
     }
  }