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