Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用BeginInvoke/Invoke获取值_C#_Multithreading - Fatal编程技术网

C# 使用BeginInvoke/Invoke获取值

C# 使用BeginInvoke/Invoke获取值,c#,multithreading,C#,Multithreading,我试图获取DataGridView的行数[dataGridView1.Rows.count]。虽然UI显示DataGridView中已经添加了多行,但我发现行数仍然为0。我发现这可能是线程问题,因此我使用以下代码检索行数: public void OnTagsReported( ... ) { ... for( var i = GetDataGridViewRowCount( dgvScanResult ) - 1; i >= 0; i-- ) { var row

我试图获取DataGridView的行数[dataGridView1.Rows.count]。虽然UI显示DataGridView中已经添加了多行,但我发现行数仍然为0。我发现这可能是线程问题,因此我使用以下代码检索行数:

public void OnTagsReported( ... )
{
  ...  

  for( var i = GetDataGridViewRowCount( dgvScanResult ) - 1; i >= 0; i-- )
  {
    var row = dgvScan.Rows[ i ];
    ...
  }  
  ...
}

protected int GetDataGridViewRowCount( DataGridView gridView )
{
  try
  {
    if( ! InvokeRequired )
    {
      return gridView.Rows.Count;
    }

    var count  = 0;
    var action = new Action<DataGridView>( delegate( DataGridView c ) 
                 { count = c.Rows.Count; } );

    gridView.Invoke( action, gridView );

    return count;
  }
  catch( ObjectDisposedException ) {}
  catch( InvalidOperationException ) {}
}
已报告(…)的标签上的公共空白 { ... 对于(var i=GetDataGridViewRowCount(dgvScanResult)-1;i>=0;i--) { var row=dgvScan.Rows[i]; ... } ... } 受保护的int GetDataGridViewRowCount(DataGridView gridView) { 尝试 { 如果(!invokererequired) { 返回gridView.Rows.Count; } var计数=0; var操作=新操作(委托(DataGridView c) {count=c.Rows.count;}); 调用(操作,gridView); 返回计数; } catch(ObjectDisposedException){} 捕获(无效操作异常){} } 我知道行数,但不知道这是不是正确的方法。我可以知道你会怎么做吗


感谢大家的关注和意见。

为什么您的OnTagsReported方法会出现在另一个线程中?无论如何,有两条评论

第一:是的,您可以这样做,但在GetDataGridViewRowCount中是一个错误。您还应该在gridView上调用InvokeRequest,因为您正在使用gridView.Invoke

第二:最好在正确的线程中调用OnTagsReported方法。那么就不需要GetDataGridViewRowCount方法了

public void OnTagsReported()
{
  if (dgvScanResult.InvokeRequired)
  {
    dgvScanResult.Invoke(new MethodInvoker(OnTagsReported), null);
    return;
  }

  for( var i = dgvScanResult.Rows.Count - 1; i >= 0; i-- )
  {
    var row = dgvScan.Rows[ i ];
    ...
  }  
  ...
}