C# c语言中带多线程的Datagridview#

C# c语言中带多线程的Datagridview#,c#,multithreading,winforms,datagridview,C#,Multithreading,Winforms,Datagridview,是否可以使用多线程从DataGridView读取数据。或者还有别的办法吗?有人能给我举个例子或概念吗 我想逐行从datagridview读取数据。并将每一行作为参数传递给一个方法 请在这方面帮助我…是否要读取数据?为什么不直接从底层数据源读取数据?可能是一个数据表 如果您能让我更清楚地了解您正在尝试的场景,将有助于提供更好的解决方案。由于数据表绑定到网格,所以需要通过UI线程访问它 下面是使用Task的示例代码 public Task<DataRow> ReadData(DataT

是否可以使用多线程从DataGridView读取数据。或者还有别的办法吗?有人能给我举个例子或概念吗

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


请在这方面帮助我…

是否要读取数据?为什么不直接从底层数据源读取数据?可能是一个数据表

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

下面是使用Task的示例代码

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

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

//定义一个线程,deligate,list

       public List<string> temp_list= new List<string>();
       public Thread Run_thread = null, run1 = null;
       private delegate void UpdateDelegate(); 
//当您按下某个按钮时,将触发下面的函数,它将启动线程执行其任务

   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);
                      }
                   })
                   );
                 } 
if(需要调用)
{
调用(新的updateLegate)(
代表
{
int rowcount=dg.Rows.Count;
对于(b=0;b
//现在完成临时存储。。。。 //现在做正常的线程工作

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


     }
     }
for(int i=0;i

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

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

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


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

那么该方法将触发一次吗?或者,您是否在匹配某个条件的每行运行该方法?您是否使用MVVM模式?如果是这种情况,您可以迭代视图模型中用于绑定视图中dataGrid的list或observableCollection属性的每个元素。感谢您的回复。。。请浏览此链接并回答我的问题。。。
          for (int i = 0; i < temp_List.Count; i++)
                  {
                // some moethod xyz where u want o pass those values
                   method_XYZ(temp_List[i]);
                  }


     }
     }