2

我有public static class MyGlobals我的应用程序范围的变量和多线程处理和更改这些变量。

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

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

我的问题是,当 Timer 线程想要更​​新绑定列表内容时,我得到InvalidOperationException

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

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

4

2 回答 2

1

您不能从不同的线程更新 UI 线程。

您可以使用这篇文章来帮助您解决它:例如做

     foreach (Device device in MyGlobals.devicesList)
     {
        Invoke(new MethodInvoker(delegate {
             device.text = "newText";
        }));
     }

或使用后台工作者

     BackgroundWorker bg = new BackgroundWorker();
     bg.DoWork += new DoWorkEventHandler(bg_DoWork);
     bg.RunWorkerAsync();

在 bg_DoWork 中:

  void bg_DoWork(object sender, DoWorkEventArgs e)
  {
     foreach (Device device in MyGlobals.devicesList)
     {
           device.text = "newText";
     }
  }
于 2013-09-12T08:38:54.243 回答
1

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

于 2013-09-12T08:42:15.397 回答