簡體   English   中英

具有BindingList的多線程C#應用程序 <T> 和DataGridView

[英]Multi-thread C# application with BindingList<T> and DataGridView

我的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.

我在修改MyGlogals列表的每個代碼塊周圍使用lock(listLock)語句,但無法控制DataGridView如何處理列表。 如何使該應用程序線程安全?

您不能從其他線程更新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";
     }
  }

GUI本身需要從GUI線程(主線程)進行更新。 .NET為此提供了BackgroundWorker類。 可以通過/或ProgressChangedRunWorkerCompleted事件完成與GUI的通信,您可以在其中傳遞選擇的對象(例如,要顯示的對象)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM