vb.net Backgroundworker工作未结束

vb.net Backgroundworker工作未结束,vb.net,backgroundworker,Vb.net,Backgroundworker,我正在从一个需要很长时间才能完成的soap调用中读取一个DataTable。为了使GUI保持活动状态并更新marquee progressbar,我可以在后台工作程序上执行soapcall,并等待它在Runworkercompletedsub中设置全局变量标志。 该表填充良好,dowork返回,但从未调用runworker completed 如果我重新编码此代码以将标志设置为DOWORK中的最后一项,那么下次调用TableGetterThread.RunWorkerAsync时,它会告诉我它不

我正在从一个需要很长时间才能完成的soap调用中读取一个
DataTable
。为了使GUI保持活动状态并更新marquee progressbar,我可以在后台工作程序上执行soapcall,并等待它在
Runworkercompleted
sub中设置全局变量标志。 该表填充良好,dowork返回,但从未调用runworker completed

如果我重新编码此代码以将标志设置为DOWORK中的最后一项,那么下次调用
TableGetterThread.RunWorkerAsync时,它会告诉我它不能同时运行任务
(其他信息:此
BackgroundWorker
当前正忙,无法同时运行多个任务。)

非常感谢任何关于我做错了什么的帮助

    waiting = True
    TableGetterThread.RunWorkerAsync(New tableInfo(tablename, filter))
    While waiting
        Me.Refresh()
        Threading.Thread.Sleep(100)
    End While

Private Sub TableGetterThread_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles TableGetterThread.DoWork
    Dim user As String = "username"
    Dim pass As String = "password"
    getTable_Table = Nothing
    getTable_Table = bromcomReader.getEntityData(e.Argument.tablename, e.Argument.Filter, user, pass).Tables(0)
    getTable_Table.TableName = e.Argument.tablename
    Console.WriteLine("FinishedDoWork")
End Sub

Private Sub TableGetterThread_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles TableGetterThread.RunWorkerCompleted
    Console.WriteLine("Completed")
    waiting = False
End Sub

缺陷在于逻辑本身。主线程和
RunWorkerCompleted
必须在同一线程上运行。因此,当您等待
waiting
设置为
false
时,您处于主线程中,因此永远不会调用
RunWorkerCompleted
。将
waiting=False
设置为
BackgroundWorker\u Dowork
中的最后一步。我建议您使用
AutoReset Event
而不是
While loop
等待

您可以使用此代码作为参考

Public Class Form1

    Private Property waiting As Boolean

    Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Console.WriteLine("Hey")
        waiting = False
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

    End Sub

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        waiting = True
        BackgroundWorker1.RunWorkerAsync()
        While waiting
            Me.Refresh()
            Threading.Thread.Sleep(100)
        End While
    End Sub
End Class

从DoWork代码中删除
Console.WriteLine(“FinishedWork”)
。同样的效果,只是后来添加了它以确保代码没有挂在bromcomReader上。getEntityData()认为问题出在您的while循环上。那之后会发生什么?你不能从RunWorkerCOmpleted子函数调用wihle循环之后的东西吗?这叫做死锁。在UI线程空闲之前,RunWorkerCompleted事件处理程序无法运行。它不是空闲的,而是卡在测试等待变量的循环中。删除该循环。如果后面有任何代码,请将该代码移到事件处理程序中。谢谢您的建议。我现在有代码了。将标志设置移到DoWork处理程序的末尾,然后在下次调用函数时不再尝试重新使用同一BackgroundWorker对象,而是将其丢弃并重新实例化一个新对象。