DerickBao 2023-07-06 17:21 采纳率: 100%
浏览 45
已结题

vb.net如何使用两个线程同时对一个datatable添加行?

现在有两个进程,一个是RecieveThread用来接收外部数据,一个是SendThread用来发送数据给外部。
接收和发送的数据都需要显示在一个gridview中,gridview绑定一个数据源datatable。
接收和发送都以datarow为单位进行。
请问如何实现?多线程搞不明白,头疼。
请最好使用vb.net语言,谢谢

  • 写回答

4条回答 默认 最新

  • PhoenixRiser 2023-07-06 17:25
    关注

    TechWhizKid参考GPT回答:

    NET的DataTables不是线程安全的,无法在不同的线程上同时修改DataTable。但可以用锁或其他同步机制来解决这个问题。例如,在多线程环境中安全地添加行到DataTable:

    先在代码中创建一个锁对象。要修改DataTable的时候,就用这个锁:

    Private tableLock As New Object()
    

    然后,在接收线程中添加行:

    Dim row As DataRow = myDataTable.NewRow()
    row("Column1") = data1
    row("Column2") = data2
    '...
    
    SyncLock tableLock
        myDataTable.Rows.Add(row)
    End SyncLock
    

    在发送线程中也同样添加行:

    Dim row As DataRow = myDataTable.NewRow()
    row("Column1") = data1
    row("Column2") = data2
    '...
    
    SyncLock tableLock
        myDataTable.Rows.Add(row)
    End SyncLock
    
    • 上面的 SyncLock 语句确保在任何时候只有一个线程可以访问和修改DataTable。当一个线程进入 SyncLock 语句时,其他试图获取该锁的线程将被阻塞,直到第一个线程退出 SyncLock 语句。

    • 这个方法可能会导致线程阻塞,如果接收和发送操作都要在几毫秒内完成,那么可能要其他更复杂的同步策略。每次对DataTable进行修改后,都要更新显示的GridView。

    • 最后由于DataTable是在多个线程上操作的,要确保DataGridView在主线程上进行更新。可以用Windows Forms的Invoke方法来实现这一点:

    Me.Invoke(New MethodInvoker(Sub() GridView1.Refresh()))
    

    以上代码在接收或发送线程修改完DataTable后,会切换到主线程更新DataGridView。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月14日
  • 已采纳回答 7月6日
  • 创建了问题 7月6日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度