Vb.net 无法从另一个线程向DataTable添加行

Vb.net 无法从另一个线程向DataTable添加行,vb.net,multithreading,data-binding,datatable,Vb.net,Multithreading,Data Binding,Datatable,这是一个代码示例,您需要在表单上放置一个名为项目列表的列表框,以重现我遇到的问题: Imports System.Threading.Tasks Public Class Form1 Dim _dt As DataTable Private Sub Form1_Load() Handles MyBase.Load _dt = New DataTable With _dt.Columns .Add("key") .Add("value")

这是一个代码示例,您需要在表单上放置一个名为
项目列表的
列表框
,以重现我遇到的问题:

Imports System.Threading.Tasks

Public Class Form1
  Dim _dt As DataTable

  Private Sub Form1_Load() Handles MyBase.Load
    _dt = New DataTable
    With _dt.Columns
      .Add("key")
      .Add("value")
    End With
    With list_of_items
      .ValueMember = "key"
      .DisplayMember = "value"
      .DataSource = _dt
    End With
    Dim addItemsTask As New Task(AddressOf AddThreeItems)
    addItemsTask.Start() 'does not add anything when done
    'AddThreeItems() #doing this instead works!
  End Sub

  Private Sub AddThreeItems()
    Threading.Thread.Sleep(2000)
    With _dt.Rows
      .Add({"1", "One"})
      .Add({"2", "Two"})
      .Add({"3", "Three"})
    End With
    Me.Invoke(Sub() Me.Text = "Separate thread is done")
  End Sub
End Class

问题是,行确实是在物理上添加的,所以
DataTable.rows.Count
会增加,但从视觉上看什么也不会发生。我尝试调用
刷新
,将
数据源
重置为
并返回-这没有帮助。如果我将此转换为单线程处理,则使用图示的方法可以很好地添加行。可能是什么问题?

重新分配数据源

Me.Invoke(
    Sub()
        list_of_items.DataSource = Nothing 
        list_of_items.DataSource = _dt 
        Me.Text = "Separate thread is done"
    End Sub
) 

我在玩
Me.Invoke
,发现如果我使用
Invoke
同步添加虚拟记录,那么之前添加的所有记录实际上都会被添加。然后我只需要从
DataTable
中删除这个虚拟记录。如果您有更好的解决方案或更优雅的解决方法,或者您可以解释为什么它是这样工作的,请随时发布它作为答案。下面是代码现在的样子:

Private Sub AddThreeItems()
  Threading.Thread.Sleep(2000)
  With _dt.Rows
    .Add({"1", "One"})
    .Add({"2", "Two"})
    .Add({"3", "Three"})
  End With
  Me.Invoke(Sub()
              _dt.Rows.Add()
              _dt.Rows.RemoveAt(_dt.Rows.Count - 1)
              Me.Text = "Separate thread is done"
            End Sub)
End Sub

它是有效的,但它违背了目的-避免重新分配
数据源
。假设其中有100000行,只需添加一行即可。我将修改您的示例,以解决重置的
ValueMember
DisplayMember
的问题-您必须再次指定它们。仍然是+1。