【问题标题】:Thread Safe Grid View Update in C# .NetC# .Net 中的线程安全网格视图更新
【发布时间】:2012-11-27 12:29:38
【问题描述】:

我正在详细解释我的问题。我在 Windows 主窗体中有一个 dataGridView。我有一个计时器,它在单击 button1 时启动。并在单击 button2 时停止。

与此同时,我正在计算一些东西并将其放入dataGridView。这是动态计算。在这个计算中,我使用了一个线程。 (我在线程中绝对是新手)。我使用Thread.Sleep(100) 来计算数据。现在我在一个循环中使用 Thread.Sleep 来计算连续事物的数据。我希望保持各自的计算顺序。在循环的每次迭代之后,我使用dataGridView.Rows.AddRange(DataGridViewRow) 添加新行并计算出新数据。

但我没有按顺序获取 dataGridView 中的数据,而且它也没有正确显示。它会在某个时候被消隐并随机出现。

P.S - 每次定时器间隔结束时我都会清除数据。

【问题讨论】:

  • 我用过System.Windows.Forms.Timer 我用过Thread.Sleep(100)。在此期间,一些数据被收集然后计算。然后我使用dataGridView.Rows.AddRange(DataGridViewRow) 将数据添加到 UI。我使用 ThreadSafe 方法通过 InovokeRequired 添加这些方法。我使用了计时器(2000)间隔。现在它给出了正确的结果。没问题。谢谢。

标签: c# .net multithreading timer


【解决方案1】:

您只能从 UI 线程访问 UI 控件。

如果您尝试从其他线程访问它们,您会发现未定义的行为。

我建议您先阅读这本免费电子书:Albahari

【讨论】:

    【解决方案2】:

    在尝试更新 datagridview 之前,您需要调用 datagridview.InvokeRequired。 如果这是真的,那么调用 Invoke 传入您希望执行的委托以及您想要传递的任何数据。

    【讨论】:

      【解决方案3】:

      已经解决了。实际上,您必须设置Thread.Sleep 计时器,使其在您的Windows.Forms.Timer 的时间间隔结束之前完成。

      【讨论】:

      • 这个问题由那个解决。欢迎任何想法。
      【解决方案4】:

      这里是设置 Gridview 的线程安全方法。

      class Program
      {
      public static List<string> ChoiceExtension = new List<string>();
      static void Main()
      {
          ChoiceExtension.Add("One");
          ChoiceExtension.Add("Two");
          ChoiceExtension.Add("Three");
          //Set list as gridsource
          InserttoGrid(ChoiceExtension);
      
      }
      
      public static void SetDataSource(object value)
          {
              DataTable dt = new DataTable();
              dt.Columns.Add("Path of Extension");
              foreach (var item in value as List<string>)
              {
                  dt.Rows.Add(new object[] { item });
      
              }
              ExtensionList.DataSource = dt;
          }
      public static void InserttoGrid(List<string> List)
          {
              if (ChoiceExtension.Count >0)
              {
      
                  if (this.ExtensionList.InvokeRequired)
                  {
                     ExtensionList.Invoke(new SetDataSourceDelegate(SetDataSource), new Object[] { List });
      
      
                  }
                  else
                  {
                      SetDataSource(List);
      
                  }
      
              }
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2011-07-21
        • 1970-01-01
        • 1970-01-01
        • 2020-08-30
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 2011-02-28
        相关资源
        最近更新 更多