Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于检索数据的VB.Net运行时后台工作程序_Vb.net_Multithreading_Backgroundworker - Fatal编程技术网

用于检索数据的VB.Net运行时后台工作程序

用于检索数据的VB.Net运行时后台工作程序,vb.net,multithreading,backgroundworker,Vb.net,Multithreading,Backgroundworker,在阅读了许多关于后台工作人员和多线程的文章之后,我有了一些工作代码,我想征求您的意见。挑战在于在单独的线程上检索数据,并用内容更新UI。我选择了运行时BGW,因为调用时遇到了麻烦;以及运行的方便性 你能看看代码,看看它的方法是否合理和合理吗?(我没有添加进度更新等) 我觉得不错。有没有什么不好的地方,或者对你来说似乎不太合适的地方?我想你已经搞定了。只需确保使用任何UI方法即可更新控件,而无需不断刷新。例如,对于列表框,在for循环之前使用lb.BeginUpdate(),之后使用lb.EndU

在阅读了许多关于后台工作人员和多线程的文章之后,我有了一些工作代码,我想征求您的意见。挑战在于在单独的线程上检索数据,并用内容更新UI。我选择了运行时BGW,因为调用时遇到了麻烦;以及运行的方便性

你能看看代码,看看它的方法是否合理和合理吗?(我没有添加进度更新等)


我觉得不错。有没有什么不好的地方,或者对你来说似乎不太合适的地方?我想你已经搞定了。只需确保使用任何UI方法即可更新控件,而无需不断刷新。例如,对于列表框,在for循环之前使用
lb.BeginUpdate()
,之后使用
lb.EndUpdate()
`谢谢Steven,这确实有效,而且我确实设置了开始/结束更新:-)。我想知道我是否遗漏了什么,比如我需要移除处理器吗?我可以在RunWorkerCompleted中完成此操作-请查看修改后的代码。另外,您认为我需要处理每个Backgroundworker吗?就处理Backgroundworker而言,此代码将在计时器上运行,从而以设定的间隔刷新网格-可能每天数百次。我是否需要担心创建的worker(在本例的StartClick中)会导致内存问题等,还是在超出范围时会被处理掉?如果后台进程正在运行,并且用户关闭了创建bgw的表单,这是否会导致问题,或者bgw是否已被处理并与表单一起GC?如果运行没有重叠,则我将只创建一个BackgroundWorker,并将其保持在表单级别。BackgroundWorker线程的IsBackground()设置为True,这允许在表单关闭时自动取消它。
Public Class BgwArgs                'args object to pass to BGW
    Public sSql As String           'query to be run by DoWork
    Public dbTable As DataTable     'return data to this table
    Public lst As ListBox           'populate this control with returned data
End Class

Private Sub btnStart_Click(sender As System.Object, e As System.EventArgs) Handles btnStart.Click
    'get new BGW, may be multiple BGW's running at a time
    Dim myBgw As BackgroundWorker = fGetBgw()
    Dim sArgs As New BgwArgs   'set Args
    sArgs.sSql = "BHRow"       'just a test string, would really be a query
    sArgs.lst = lstBH          'control to populate
    myBgw.RunWorkerAsync(sArgs)
End Sub

Private Function fGetBgw() As BackgroundWorker
   'create New backgroundworker and addhandlers
    Dim newBgw As New BackgroundWorker
    myBgw.WorkerReportsProgress = True
    myBgw.WorkerSupportsCancellation = True
    AddHandler myBgw.DoWork, AddressOf WorkerDoWork
    AddHandler myBgw.ProgressChanged, AddressOf WorkerProgressChanged
    AddHandler myBgw.RunWorkerCompleted, AddressOf WorkerCompleted
    Return newBgw
End Function

Private Sub WorkerDoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
    Thread.Sleep(3000)  'kill time as a test
    Dim sArgs As BgwArgs = e.Argument
    pGetDbTable(sArgs)    'pass in Args to DataQuery
    e.Result = sArgs      'set result for use in Completed event
End Sub

Private Sub WorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs)
    Dim sArgs As BgwArgs = e.Result
    Dim tbl As DataTable = sArgs.dbTable
    Dim lb As ListBox = sArgs.lst
    Dim thisBgw As BackgroundWorker = CType(sender, BackgroundWorker)

    If e.Cancelled = True Then

    ElseIf e.Error IsNot Nothing Then
        MsgBox(e.Error.Message)

    Else

        For Each row As DataRow In tbl.Rows
            'update UI, bind data here, etc.
            lb.Items.Add(row("col1").ToString)
        Next
        RemoveHandler thisBgw.DoWork, AddressOf WorkerDoWork
        RemoveHandler thisBgw.ProgressChanged, AddressOf WorkerProgressChanged
        RemoveHandler thisBgw.RunWorkerCompleted, AddressOf WorkerCompleted
     Endif

End Sub

Private Sub pGetDbTable(sArgs As BgwArgs)
    Dim tbl As New DataTable
    'would really run a SQL query here... and return the Datatable
    With tbl
        .Columns.Add("col1")
        Dim i As Integer
        For i = 0 To 200
            .Rows.Add(sArgs.sSql & i)
        Next
        sArgs.dbTable = tbl
    End With
End Sub