2

是否可以使用 Multi thread 从 DataGridView 读取数据。或者还有其他方法吗?谁能给我一个例子或概念?

我想逐行读取 datagridview 中的数据。并将每一行作为参数传递给方法。

请在这方面帮助我...

4

3 回答 3

1

你想读取数据不是吗?为什么不直接从底层数据源读取呢?可能是数据表。

如果您能让我更清楚地了解您正在尝试的场景,将有助于提供更好的解决方案。由于数据表绑定到网格,您需要通过 UI 线程访问它。

这是使用任务的示例代码。

 public Task<DataRow> ReadData(DataTable table, int rowId)
   {
       return Task<DataRow>.Factory.StartNew(() => table.Rows[rowId]);
   }

你需要同步机制来访问这一行,因为它在不同的线程中运行,

于 2013-08-01T08:02:30.397 回答
0

// 定义一个线程,委托,列表

       public List<string> temp_list= new List<string>();
       public Thread Run_thread = null, run1 = null;
       private delegate void UpdateDelegate(); 

//在表单加载事件期间启动线程......然后暂停它直到你想开始......

        run1 = new Thread(new ThreadStart(run_tab));
        run1.IsBackground = true;
        run1.Start();

        Datagridview dg = new Datagridview();
        dg.Rows.Add();

//当你按下某个按钮时,下面的函数将被触发.....它会启动线程来完成它的工作..

   private void Btn_run_Click(object sender, EventArgs e)
    {
       if (run1.ThreadState == System.Threading.ThreadState.Aborted)
         {
            try
            {
                myResetEvent.Reset();
            }
            catch (Exception ex)
             {
                 throw new Exception("Exception message:" + ex.Message);
              }
          }
           else
            {
               try
                  {
                    myResetEvent.Set();
                   }
                   catch (Exception ex)
                    {
                     throw new Exception("Exception message:" + ex.Message);
                   }
           }
    }

// 添加几行后,您希望线程应该将每一行的值从 gridview 传递给某个方法。

       private  void run_tab()
          {

              while (true)
              {
                 myResetEvent.WaitOne();

// 上面的这个命令将停止线程的执行,直到你按下某个按钮或其他事件,或者说你希望线程何时开始执行它的操作

//根据我的方法,读取一次完整的gridview行并将其所有值存储在临时列表中,一旦完成,然后使用这些值运行后台线程..

            if (InvokeRequired)
                     {
                 Invoke(new UpdateDelegate(
                  delegate
                  {
                       int rowcount = dg.Rows.Count;

                    for (b = 0; b < rowcount; b++)
                      {
                         string temp= dg.Rows[b].Cells[0].Value.ToString();
                         temp_List.Add(type1);
                      }
                   })
                   );
                 } 

// 现在完成了临时存储...... // 现在做正常的线程工作......

          for (int i = 0; i < temp_List.Count; i++)
                  {
                // some moethod xyz where u want o pass those values
                   method_XYZ(temp_List[i]);
                  }


     }
     }

希望这能为您的问题提供一些解决方案...

于 2013-08-01T12:20:12.017 回答
0

不,在主 UI 线程以外的任何线程上访问DataGridView(或任何相关的)都是不安全的。Control这包括从控件读取数据。你不能安全地做到这一点。

您需要做的是维护一个单独的数据结构来保存数据,然后从中读取。这是额外的工作,因为现在您必须使 DataGridView 与其他数据结构保持同步。如果您手动将行添加到网格,那么它可能很容易。如果您正在对网格进行数据绑定(通过BindingList或其他方式),那么它可能会有点棘手。

请记住,涉及的技巧Contol.Invoke不会实现并发读取行为,因为实际读取将被编组到 UI 线程上。您不妨完全避免使用多线程。但是,您可以做的是在 UI 线程上单独读取数据行,将它们复制到 POCO 数据结构中,然后将 POCO 对象传送到您要调用的方法并让它在 aTask或退出工作线程。

于 2013-08-01T15:20:39.557 回答