button.click サブに次のコードがあります。1 つのアクセス DB からデータを取得し、行を 1 つずつ SQL DB にロードします。コードを挿入する行は、既にテスト済みであるためコメント化されています。
Dim cSQL As New SqlConnection(conSQL)
Dim fecha1, fecha2 As Date
Dim strfecha1, strfecha2 As String
For Each dr As DataRow In dt.Rows
fecha1 = CDate(dr.Item(0))
fecha2 = CDate(dr.Item(18))
strfecha1 = fecha1.ToString("yyyyMMdd hh:mm:ss tt").Replace(".", "")
strfecha2 = fecha2.ToString("yyyyMMdd hh:mm:ss tt").Replace(".", "")
selSQL = "insert into ttransactionlog1 ([OccurDateTime],[NodeID],[Kind],[UUID],[UserID],[FirstName],[LastName],[MI],[Department],[Rank],[CardID],[CreateDateTime],[LeftRight],[HD],[RotationDegree],[StableTimeInterval],[DecisionTimeInterval],[Message],[PIN]) values " + _
"('" + strfecha1 + "'," + _
dr.Item(1).ToString + "," + _
dr.Item(2).ToString + "," + _
dr.Item(4).ToString + ",'" + _
dr.Item(3).ToString + "','" + _
dr.Item(5).ToString + "','" + _
dr.Item(6).ToString + "','" + _
dr.Item(7).ToString + "','" + _
dr.Item(8).ToString + "','" + _
dr.Item(9).ToString + "','" + _
dr.Item(10).ToString + "','" + _
strfecha2 + "'," + _
dr.Item(16).ToString + "," + _
dr.Item(14).ToString + "," + _
dr.Item(15).ToString + "," + _
dr.Item(12).ToString + "," + _
dr.Item(13).ToString + ",'" + _
dr.Item(11).ToString + "'," + _
dr.Item(17).ToString + ")"
daSQL.InsertCommand = New SqlCommand(selSQL, cSQL)
'cSQL.Open()
'daSQL.InsertCommand.ExecuteNonQuery()
'cSQL.Close()
'DataGridView1.Rows.Insert(0, dr.ItemArray)
'If DataGridView1.Rows.Count > 10 Then
' DataGridView1.Rows.RemoveAt(10)
'End If
procesar = New Thread(AddressOf Me.actGrilla)
procesar.IsBackground = True
procesar.Start(dr)
'actGrilla(dr)
Next
挿入されたデータ行を一番上の位置に表示し、最大 10 個のレコードを画面に表示する DGV を更新したいので、この方法で新しいスレッドにサブを作成しようとしています。
Sub actGrilla(ByVal dr As DataRow)
If InvokeRequired Then
Dim uud As New llamaactGrilla(AddressOf actGrilla)
Invoke(uud, dr)
Else
DataGridView1.Rows.Insert(0, dr.ItemArray)
If DataGridView1.Rows.Count > 10 Then
DataGridView1.Rows.RemoveAt(10)
End If
DataGridView1.Refresh()
End If
End Sub
私の問題は、この方法を試してみると、コードは常にinvokeRequired trueになり、メモリ障害(約5000レコード)で崩壊し、スレッドなしでやろうとすると、最終的にプログラムのサイクル内に「else」コードを書くことですcotextswitchdeadlock で崩壊します。
私が間違っていることは何ですか?