2013-12-10 71 views
0

在VB.Net我創建了一個似乎工作的後臺工作。它是建立這樣的:vb.net - 我如何修復與後臺工作者的交叉

Private bw As BackgroundWorker = New BackgroundWorker 

Public Sub construct_configure() 
     bw.WorkerReportsProgress = True 
     bw.WorkerSupportsCancellation = True 
     AddHandler bw.DoWork, AddressOf bw_DoWork 
     AddHandler bw.ProgressChanged, AddressOf bw_ProgressChanged 
     AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted 
end sub 

然後我有的doWork小組成立這樣的:

Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) 

     ' create the picture box 
     pic_holder = New PictureBox() 

     ' Show GIF and disable whatever you need to 
     With pic_holder 
      .Image = My.Resources.counter_gif 
      .Size = New Size(200, 100) 
      .Location = New Point(0, 0) 
      .Visible = True 
      .BackColor = Color.Red 

     End With 
     Main.Controls.Add(pic_holder) 
     pic_holder.BringToFront() 

     MessageBox.Show("worker started") 

    End Sub 

消息框顯示出來,當我在我的按鈕,點擊呼叫分,但動畫GIF永遠不會。我試圖簡單地設置一個指標,說明有一些後臺工作正在進行。當我將它設置在父分支中時,gif顯示出來。

此外,我想將gif放置在已存在的面板中,但每次嘗試時,都會發生交叉線程錯誤,該錯誤說明該面板是在另一個線程中創建的。我該如何解決這個問題?

謝謝。

+0

這是一個Windows應用程序或WCF嗎? WCF有一種方法可以使用Dispatcher輕鬆地從GUI控件的線程調用方法...可用的方法取決於您的應用程序的技術。 – ps2goat

+0

您通過不使用BGW修復它。當代碼需要幾微秒時,完全沒有意義。 –

+0

@HansPassant你爲什麼假設代碼只需要幾微秒?實際的工作可能需要相當長的時間。我假設OP排除了實際的後臺工作將要完成,因爲它尚未被編碼,或者因爲它與問題無關。 –

回答

1

建議您如果要調用主窗體,您應該在ProgressChanged事件中執行此操作。 bw_ProgressChanged在主窗體的同一線程上被調用。

Private Sub bw_DoWork(sender As Object, e As DoWorkEventArgs) Handles bw.DoWork 

    'WORKER THREAD, do not invoke main form. 

    Dim worker As BackgroundWorker = CType(sender, BackgroundWorker) 

    'Report start 
    worker.ReportProgress(0) 

    'Do some work... 
    Threading.Thread.Sleep(5000) 

    'Report end. 
    worker.ReportProgress(100) 

End Sub 

Private Sub bw_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles bw.ProgressChanged 

    'MAIN THREAD, safe to invoke main form. 

    If (e.ProgressPercentage = 0) Then 
     'Started: Do something... 
    ElseIf (e.ProgressPercentage = 100) Then 
     'Stopped: Do something... 
    End If 

End Sub 
+0

謝謝比約恩,雖然我現在可以從progressChanged Sub中調用其他現有的面板而不會出錯,但我的圖片框仍然不顯示。我在progressChanged Sub中放了一個消息框,然後看到消息框,但IU上仍然沒有任何消息。 – user2721815

+0

好的,我已經取得了一些進展。我在ProgressChanged Sub中創建了圖片框,現在它顯示出來,但直到後臺工作人員完成後才顯示。所以它只是坐在那裏,等待工人完成,然後顯示出來。我在RunWorkerCompletedSub中沒有任何內容。 – user2721815

+0

如果將它添加到表單中,請嘗試將'Main.Controls.Add(pic_holder)''更改爲'Me.Controls.Add(pic_holder)'。如果不是,那麼我需要查看_bw_ProgressChanged_的代碼。 –