Vb.net BackgroundWorker冻结GUI

Vb.net BackgroundWorker冻结GUI,vb.net,multithreading,backgroundworker,Vb.net,Multithreading,Backgroundworker,我读过其他关于这方面的帖子,但我似乎仍然无法让它正常工作 每当我的BackgroundWorker开始工作时,我的函数API.CheckForUpdate就会导致GUI挂起。我不能点击任何东西。它只冻结了半秒钟,但足以引起注意 我怎样才能解决这个问题?我应该深入研究API.CheckForUpdate并在特定语句上运行单个线程,还是可以让一个包罗万象的线程来处理这个问题?API.CheckForUpdate未引用Form1中的任何内容 此外,我认为Form1_Load不是放置RunWorkerA

我读过其他关于这方面的帖子,但我似乎仍然无法让它正常工作

每当我的BackgroundWorker开始工作时,我的函数API.CheckForUpdate就会导致GUI挂起。我不能点击任何东西。它只冻结了半秒钟,但足以引起注意

我怎样才能解决这个问题?我应该深入研究API.CheckForUpdate并在特定语句上运行单个线程,还是可以让一个包罗万象的线程来处理这个问题?API.CheckForUpdate未引用Form1中的任何内容

此外,我认为Form1_Load不是放置RunWorkerAsync调用的最佳位置。哪里有更好的地方

'Declarations
Dim ApplicationUpdate As BackgroundWorker = New BackgroundWorker

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ApplicationUpdate.WorkerSupportsCancellation = True
    ApplicationUpdate.WorkerReportsProgress = True
    AddHandler ApplicationUpdate.DoWork, AddressOf ApplicationUpdate_DoWork
    AddHandler ApplicationUpdate.ProgressChanged, AddressOf ApplicationUpdate_ProgressChanged
    AddHandler ApplicationUpdate.RunWorkerCompleted, AddressOf ApplicationUpdate_RunWorkerCompleted
    ApplicationUpdate.RunWorkerAsync()
End Sub

Private Sub ApplicationUpdate_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
    'Check for an update (get the latest version)
    Dim LatestVersion = API.CheckForUpdate
End Sub

Private Sub ApplicationUpdate_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
    'Nothing here
End Sub

Private Sub ApplicationUpdate_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
    'Work completed
    MsgBox("Done")
End Sub

尝试在加载事件之外启动进程。创建一个计时器并在加载事件时启动它,然后处理该事件:

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Timer1.Enabled = False
    ApplicationUpdate.RunWorkerAsync()
End Sub

这不是一个后台工作人员修复程序,但如果您不介意四处走动,不找到答案,您可以这样编写代码:

请记住,当您第一次启动一个线程并且在模型中编码时,您必须将(me)传递到初始线程中,因为VB有“默认表单实例”的概念。对于应用程序命名空间中的每个表单,将在“我的命名空间”中的Forms属性下创建一个默认实例

这只是添加了一个额外的参数,就像这样

----------------------/启动主线程/-----------------------------------

Private Sub FindCustomerLocation()
Dim Findcontractor_Thread As New Thread(AddressOf **FindContractor_ThreadExecute**)
Findcontractor_Thread.Priority = ThreadPriority.AboveNormal
Findcontractor_Thread.Start(me)
End Sub
Delegate Sub **FindContractor_WorkingThread**(s As Integer,beginform as       *NameOfFormComingFrom*)
Sub **FindContractor_WorkingThreadInvoke**(ByVal s As Integer,beginform as     *NameOfFormComingFrom*)
If beginform.mouse.InvokeRequired Then
Dim d As New FindContractor_WorkingThread(AddressOf        FindContractor_WorkingThreadInvoke)
beginform.Invoke(d, New Object() {s,beginform})
Else
 beginform.Mouse.OverrideCursor = Cursors.Wait

'Do something...

beginform.Mouse.OverrideCursor = Nothing
End If
End Sub
------------------/Running Thread/---------------

Private Sub FindCustomerLocation()
Dim Findcontractor_Thread As New Thread(AddressOf **FindContractor_ThreadExecute**)
Findcontractor_Thread.Priority = ThreadPriority.AboveNormal
Findcontractor_Thread.Start(me)
End Sub
Delegate Sub **FindContractor_WorkingThread**(s As Integer,beginform as       *NameOfFormComingFrom*)
Sub **FindContractor_WorkingThreadInvoke**(ByVal s As Integer,beginform as     *NameOfFormComingFrom*)
If beginform.mouse.InvokeRequired Then
Dim d As New FindContractor_WorkingThread(AddressOf        FindContractor_WorkingThreadInvoke)
beginform.Invoke(d, New Object() {s,beginform})
Else
 beginform.Mouse.OverrideCursor = Cursors.Wait

'Do something...

beginform.Mouse.OverrideCursor = Nothing
End If
End Sub
------------------/如何从线程设置UI调用---------------------

Private Sub FindCustomerLocation()
Dim Findcontractor_Thread As New Thread(AddressOf **FindContractor_ThreadExecute**)
Findcontractor_Thread.Priority = ThreadPriority.AboveNormal
Findcontractor_Thread.Start(me)
End Sub
Delegate Sub **FindContractor_WorkingThread**(s As Integer,beginform as       *NameOfFormComingFrom*)
Sub **FindContractor_WorkingThreadInvoke**(ByVal s As Integer,beginform as     *NameOfFormComingFrom*)
If beginform.mouse.InvokeRequired Then
Dim d As New FindContractor_WorkingThread(AddressOf        FindContractor_WorkingThreadInvoke)
beginform.Invoke(d, New Object() {s,beginform})
Else
 beginform.Mouse.OverrideCursor = Cursors.Wait

'Do something...

beginform.Mouse.OverrideCursor = Nothing
End If
End Sub

你能发布CheckForUpdates方法吗?我可以,但很长。基本上,它创建一个WebRequest来使用GET请求查询网站,并使用StreamReader将其读入内存。该网站只包含一个版本号,例如2.4。谢谢,但我试过了,它仍然冻结。我将计时器设置为Form1上的控件,时间为1秒。