none
請教有關Backgroundworker 的問題 RRS feed

  • 問題

  • Code Snippet

    Public Class Form1
    Dim CK As Boolean = False
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim i As Integer
    For i = 0 To 10000
    Dim bk As New System.ComponentModel.BackgroundWorker
    AddHandler bk.DoWork, AddressOf go
    CK = False
    bk.RunWorkerAsync()
    While CK = False
    Threading.Thread.Sleep(10)
    End While
    Debug.WriteLine(i)
    Next
    End Sub


    Sub go(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
    CK = True
    Application.DoEvents()
    System.Threading.Thread.Sleep(1000) '如果這個值為1可以跑很快 反之則很慢

    End Sub

    End Class


    請問 ............
    我以為 當我執行了 bk.
    RunWorkerAsync() 會立即產生新的執行緒去執行go 的副程式
    所以,go 副程式裡面的 thread.sleep 值的大小,應該不會影響到主執行緒裡的動作阿
    可是躲把 Go 裡的 Sleep 設 1000 時, 主執行緒裡的迴圈 就會跑很慢,如果設成1
    就可以跑很快 為什麼呢???





    2008年8月5日 下午 01:32

解答

  • HI,

     

    這是您的程式的主執行緒的迴圈將CPU吃死的關係, 請將程式改成這樣就OK了:

     

    Dim t As Thread
    Dim bk As New System.ComponentModel.BackgroundWorker
    Dim CK As Boolean = False

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim i As Integer
            AddHandler bk.DoWork, AddressOf go
            AddHandler bk.RunWorkerCompleted, AddressOf completed

            t = New Thread(AddressOf ThreadProc)
            t.Start()
        End Sub

        Sub ThreadProc()
            For i = 0 To 10000
                CK = False
                bk.RunWorkerAsync()
                While CK = False
                    Threading.Thread.Sleep(10)
                End While
                Debug.WriteLine(i)
            Next
        End Sub

        Sub go(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
            System.Threading.Thread.Sleep(1000) '如果這個值為1可以跑很快 反之則很慢
        End Sub

        Sub completed(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
            CK = True
        End Sub

     

    tihs

    2008年8月6日 上午 02:48

所有回覆

  • 你這邊用無限迴圈等待,不慢也滿奇怪的。

    Code Snippet
    While CK = False
    Threading.Thread.Sleep(10)
    End While

     

     

    你如果迴圈等待是必要的邏輯,那麼把 CK=True 放在另一個執行緒顯然是不穩固的。

     

    若是主執行緒的輪詢繼續時,新的子執行緒才跑到

    Code Snippet

    Sub go(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)

     

     

    顯然此時的 CK 仍然為 False ,你的迴圈就不會跑進去,不如依照線上手冊的範例,用

    bk.IsBasy

    做判斷條件還比較妥當。

    2008年8月5日 下午 01:44
  • 感謝心大您的回覆
    其實在 GO 這個副程式裡面是個無限迴圈,他會每一分鐘對終端機下一個指令。
    目的是要模擬5000個以上的使用者同時操作,來進行壓力測試。
    所以 bk 永遠都是 busy 的 orz..
    2008年8月5日 下午 02:06
  • HI,

     

    這是您的程式的主執行緒的迴圈將CPU吃死的關係, 請將程式改成這樣就OK了:

     

    Dim t As Thread
    Dim bk As New System.ComponentModel.BackgroundWorker
    Dim CK As Boolean = False

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim i As Integer
            AddHandler bk.DoWork, AddressOf go
            AddHandler bk.RunWorkerCompleted, AddressOf completed

            t = New Thread(AddressOf ThreadProc)
            t.Start()
        End Sub

        Sub ThreadProc()
            For i = 0 To 10000
                CK = False
                bk.RunWorkerAsync()
                While CK = False
                    Threading.Thread.Sleep(10)
                End While
                Debug.WriteLine(i)
            Next
        End Sub

        Sub go(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
            System.Threading.Thread.Sleep(1000) '如果這個值為1可以跑很快 反之則很慢
        End Sub

        Sub completed(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
            CK = True
        End Sub

     

    tihs

    2008年8月6日 上午 02:48