2015-09-10 75 views
0

我有一個後臺工作人員運行循環查詢數據庫,直到返回一個值。它需要在加載和刷新時啓動。上載似乎運行良好,但當我再次調用它失敗「BackgroundWorker目前正忙,無法同時運行多個任務」BackgroundWorker當前正忙,無法同時運行多個任務

我添加了backgroundworker到我的表單,添加了它需要做的工作事件。

Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwProcessResource.DoWork 
     Logic.SetConnection(connectionString) 
     materialConfirmed = False 
     Dim sqlManager As New BOMIDatabaseManager(connectionString) 
     Dim currentInstance As New ResourceInstance(resource, instance) 
     Dim results As New Hashtable 
     status = Logic.ProcessResource(currentInstance) 
     While status.woID.Count <= 0 
      status = Logic.ProcessResource(currentInstance) 
     End While 
     currentWO = status.woID(0) 
    End Sub 

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwProcessResource.RunWorkerCompleted 
     WaitingForm.Close() 
     'Me.Enabled = False 
     currentWO = status.woID(0) 
     controller.SelectWorkOrder(status.woID(0), "20") 
    End Sub 

它刷新它必須已經完成,所以我不知道它爲什麼說它很忙。

+0

後異常的堆棧跟蹤。 –

+0

爲每個新任務使用新的後臺工作人員。聽起來你試圖重複使用相同的後臺工作人員 –

+0

正確,我使用工具欄項目創建了一個。 – asdfasfd

回答

0

您可以通過支持取消來重用該工作人員。將WorkerSupports取消屬性設置爲True或者在設計器中或通過代碼。

BackgroundWorker1.WorkerSupportsCancellation = True 

在刷新按鈕中,檢查工作人員當前是否忙,如果是,取消任務。

If (BackgroundWorker1.IsBusy) Then 
    BackgroundWorker1.CancelAsync() 

    ' Spin up another thread to wait 2 seconds and allow the 
    ' background worker to stop so that you can start it. 
    ' If you don't want to do this, do something else to allow time to pass 
    Dim myTask As New Task(Sub() 
           Threading.Thread.Sleep(2000) 
          End Sub) 

    myTask.ContinueWith((Sub() BackgroundWorker1.RunWorkerAsync())) 

    myTask.Start() 

Else 

    BackgroundWorker1.RunWorkerAsync() 

End If 

這意味着,從上面的代碼需要尋求取消和停止辦理工作

While status.woID.Count <= 0 
    If (BackgroundWorker1.CancellationPending) Then 
     Exit While 
    End If 

    status = Logic.ProcessResource(currentInstance) 
End While 
-1
If (BackgroundWorker1.IsBusy) Then 
    Else 
     BackgroundWorker1.RunWorkerAsync() 
    End If 
+0

這將有助於解釋您認爲這將解決問題的原因,以及對相關文檔或示例的引用。例如,似乎有人質疑BackgroundWorker是否可以重用;一個顯示重用的例子會很有幫助。 – matthias

+0

有人錯誤地將您的答案標記爲低質量。您應該添加一些伴隨文字來解釋您的答案如何工作,以防止進一步標記和/或降價。只有代碼答案[不是低質量](https://meta.stackoverflow.com/a/358757/1364007)。它是否試圖回答這個問題?如果不是,則標記爲「不是答案」或建議刪除(如果在審閱隊列中)。 b)技術上不正確? Downvote或評論。 [來自評論](https://stackoverflow.com/review/low-quality-posts/18825118)。 –

+0

只需複製[以前的答案]的一部分(// stackoverflow.com/a/32511418)就是抄襲。如果你繼續這樣做,你會收到禁令。 – robinCTS

相關問題