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

标签 vb.net multithreading data-binding datatable

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

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 增加,但视觉上没有任何反应。我尝试调用 Refresh,将 DataSource 重置为 Nothing 并返回 - 这没有帮助。如果我将其切换为单线程处理,则可以使用所示方法很好地添加行。可能是什么问题?

最佳答案

重新分配数据源

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

关于vb.net - 无法从另一个线程向 DataTable 添加行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13055035/

相关文章:

asp.net - 工具提示隐藏在下拉列表后面?你怎么能避免这种情况? (IE6)

vb.net - 关闭 Windows 窗体应用程序和 excel.exe 进程如何交互(可能通过垃圾收集器)?

android - 在数据绑定(bind)中设置动态布局高度

linux - 如何使用 strace 跟踪子进程?

c# - 如何将 dataGridView 预定义列与 sql 语句中的列绑定(bind)(不添加新列)?

.net - 如何绑定(bind) WinForm 文本框以在 TextChanged 而不是 LostFocus 上更新

asp.net - 如何修复 func 在命名空间中不明确 'system' 编译器错误

c# - c# 中的 vbNullChar 等价物是什么?

java - 使用 java(Threads) 从方法返回值

c# - 任务(或线程)需要 Wait 或 Join 才能工作