如何在parallel.For中使用DataGridView?

How to use DataGridView in parallel.For?

这是我的程序的一部分:

Parallel.For(1, m,
            Sub(i)
                
  ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

 Dim html As String = ""

 Dim request As HttpWebRequest = HttpWebRequest.Create(slink(i, 1))

 request.AutomaticDecompression = DecompressionMethods.GZip

 request.Timeout = 500

 request.Method = "GET"

  request.UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20100101 Firefox/42.0"

 Using response As Task(Of WebResponse) = request.GetResponseAsync

 If response.Result IsNot Nothing Then

  Using ioStream As IO.Stream = response.Result.GetResponseStream

 Using sr As New System.IO.StreamReader(ioStream)

                                    html = sr.ReadToEnd

                                    s = html.Split(";")
         
                                    r = s(0).Split(",")

  row = New String() {r(0),r(1),r(2),r(3),r(4),r(5)}

 DataGridView1.Rows.Add(row)
                                        DataGridView1.FirstDisplayedScrollingRowIndex = DataGridView1.RowCount - 1

                           End Using

                            End Using

                        End If

                    End Using
              
            End Sub)

当我运行程序时,出现如下错误。我该如何解决这个问题?

'System.InvalidOperationException' 类型的异常发生在 System.Windows.Forms.dll 中,但未在用户代码中处理

附加信息:跨线程操作无效:控件 'DataGridView1' 从创建它的线程以外的线程访问。

最简单的选择是替换这些行:

DataGridView1.Rows.Add(row)
DataGridView1.FirstDisplayedScrollingRowIndex = DataGridView1.RowCount - 1

有了这个:

DataGridView1.BeginInvoke(Sub()
                              DataGridView1.Rows.Add(row)
                              DataGridView1.FirstDisplayedScrollingRowIndex = DataGridView1.RowCount - 1
                          End Sub)

要了解有关其工作原理以及如何使用一致的分步过程来编组对 UI 线程的调用的更多信息,请参阅 here