none
請教關於backgroundworker用法 RRS feed

  • 問題

  • 小弟沒使用過這元件  不知道該如何使用  想請教會使用的大大

    在form中 我加入backgroundworker元件和一個啟動按鈕

    按鈕click

    Me.BackgroundWorker1.RunWorkerAsync(2000)    '這不知道有沒有錯誤

    看了一下事件 覺得要執行的動作應該在 BackgroundWorker1_DoWork這事件

    這裡我要如何宣告  才能執行DOWORK中的動作  然後送出值讓執行成功(失敗,取消)   都可以獲取相對應訊息

    DoWork我貼上想要執行的程式碼

    Dim j As Integer
                    Dim i As Integer = DataGridView1.Rows.Count
                    Dim url As String
                    For j = 0 To i - 1
                        TextBox4.Clear()
                        url = DataGridView1.Rows(j).Cells.Item(3).Value.ToString
                        Dim timeout As Integer = 1000
                        Dim pinfo As New ProcessStartInfo
                        WebBrowser1.Navigate(url)
                        pinfo.FileName = Me.TextBox4.Text.ToString
                        Dim p As Process = Process.Start(pinfo)
                        p.WaitForInputIdle()
                        p.WaitForExit()
                        If p.HasExited = False Then
                            If p.Responding Then
                                p.Kill()
                            End If
                            p.Dispose()
                        End If
                    Next
                End If
            Catch ex As Exception

            End Try

    不知道要如何修改上面程式碼在DOWORK事件中.....

     

    在BackgroundWorker1_RunWorkerCompleted事件中

    小弟也不知道如何確定成功,取消,錯誤的值  然後秀出相關訊息

    messagebox.show("執行完畢")......等

    再來使用非同步背景執行  需不需要去設定時間還是這元件本身就會處理

    小弟對這元件很模糊  表達不知道清不清楚

    希望有經驗的大大   給個方向或範例

    感謝

    2007年6月21日 下午 02:10

解答

  • Dear Sir

    那麼這樣看起來不用backgroundworker也是可以做到,你已經知道問題在哪裡,所以像下面這樣應該是可行的

       

    Code Snippet

    ''用來判斷網頁使否載入完成

        Dim IsWebBrowserComplete As Boolean = False

        ''寫入文字檔的資料流

        Dim SW As System.IO.StreamWriter

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            ListBox1.Items.Add("www.yahoo.com.tw")

            ListBox1.Items.Add("www.google.com.tw")

            ListBox1.Items.Add("www.hinet.net")

        End Sub

     

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

            ''預先開啟資料流

            SW = New IO.StreamWriter("C:\Test.txt", False)

            For i As Integer = 0 To ListBox1.Items.Count - 1

                ''將旗標設定為初始值

                IsWebBrowserComplete = False

                WebBrowser1.Navigate(ListBox1.Items(i))

                ''判斷網頁是否載入完成

                Do While Not IsWebBrowserComplete

                    Application.DoEvents()

                    System.Threading.Thread.Sleep(10)

                Loop

                ''寫入文字檔

                SW.WriteLine(WebBrowser1.DocumentTitle)

            Next

            ''關閉資料流

            SW.Flush()

            SW.Close()

            SW.Dispose()

        End Sub

     

        Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

            IsWebBrowserComplete = True

        End Sub

     

    另外,backgroundworker既然已經接觸到了,還是可以參考 馬小玲 大提供的相關資源,一併瞭解一下,一開始不用完全了解的很完整,但是要大概知道這東西是在做甚麼、有甚麼用途;那麼以後寫程式的過程遇到相關問題時就會聯想到有這個東西可以用,那個時候再研究深入一點 ~

    以上,參考看看,希望有幫助。

    2007年6月21日 下午 04:16
    版主

所有回覆

  • hi 你好:

                   http://blog.blueshop.com.tw/gogojsp/archive/2007/03/04/49814.aspx

                    簡單的範例,您可以參考一下^^

                                                                                         馬小玲  http://blog.blueshop.com.tw/swtnwr

    2007年6月21日 下午 02:22
  • 不好意思,忽然發現這個範例是c#的= =""  如果您需要翻成vb,再講一下吧
    2007年6月21日 下午 02:25
  • Dear Sir

    從前面相關討論文章到現在這一篇,我比較想知道您想要做到的是甚麼樣的功能呢?

    利用p.Start去執行的是甚麼動作(程式)呢?p.Start之後想利用WaitForExit來做甚麼呢?

     

    2007年6月21日 下午 03:02
    版主
  • Hi,

    因為不確定你要做的是甚麼,我做了下面簡單的測試,效果是當按鈕按下時,webbrowser會逐一顯示網頁;利用backgroundworker來跑proccess.start的部分,你可以自己跑跑看

    Code Snippet

    Public Class Form1

     

        Dim ShareVara As Integer = 1

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            ListBox1.Items.Add("www.yahoo.com.tw")

            ListBox1.Items.Add("www.google.com.tw")

            ListBox1.Items.Add("www.hinet.net")

        End Sub

     

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

            For i As Integer = 0 To ListBox1.Items.Count - 1

                WebBrowser1.Navigate(ListBox1.Items(i))

                Do While WebBrowser1.Document Is Nothing

                    Application.DoEvents()

                Loop

                Do While WebBrowser1.Document.Window Is Nothing

                    Application.DoEvents()

                Loop

                Application.DoEvents()

                Me.Refresh()

                ShareVara = i

                BackgroundWorker1.RunWorkerAsync()

                Do While BackgroundWorker1.IsBusy

                    Application.DoEvents()

                    System.Threading.Thread.Sleep(10)

                Loop

            Next

        End Sub

     

        Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

            Dim pinfo As New ProcessStartInfo

            pinfo.FileName = "C:\test\" & ShareVara + 1 & ".txt"

            Dim p As Process = Process.Start(pinfo)

            p.WaitForExit()

            p.Dispose()

        End Sub

    End Class

     

    2007年6月21日 下午 03:17
    版主
  •  bauann 寫信:

    Hi,

    因為不確定你要做的是甚麼,我做了下面簡單的測試,效果是當按鈕按下時,webbrowser會逐一顯示網頁;利用backgroundworker來跑proccess.start的部分,你可以自己跑跑看

    Code Snippet

    Public Class Form1

     

        Dim ShareVara As Integer = 1

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            ListBox1.Items.Add("www.yahoo.com.tw")

            ListBox1.Items.Add("www.google.com.tw")

            ListBox1.Items.Add("www.hinet.net")

        End Sub

     

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

            For i As Integer = 0 To ListBox1.Items.Count - 1

                WebBrowser1.Navigate(ListBox1.Items(i))

                Do While WebBrowser1.Document Is Nothing

                    Application.DoEvents()

                Loop

                Do While WebBrowser1.Document.Window Is Nothing

                    Application.DoEvents()

                Loop

                Application.DoEvents()

                Me.Refresh()

                ShareVara = i

                BackgroundWorker1.RunWorkerAsync()

                Do While BackgroundWorker1.IsBusy

                    Application.DoEvents()

                    System.Threading.Thread.Sleep(10)

                Loop

            Next

        End Sub

     

        Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

            Dim pinfo As New ProcessStartInfo

            pinfo.FileName = "C:\test\" & ShareVara + 1 & ".txt"

            Dim p As Process = Process.Start(pinfo)

            p.WaitForExit()

            p.Dispose()

        End Sub

    End Class

     

    跟大大報告一下我想要的功能  我有100各網址  我希望我的webbrowser元件可以去開啟這100各網頁  旦毎開一次網頁當完成後

    便會取得該網頁的標題然後把標題字串給寫入C:\webtitle.txt  檔案  所以當初我才會想用迴圈去執行這100各重複的動作 旦發現webbrowser執行連續的網頁  通常都會覆蓋前面的  所以常常成功後 都只有取得最後一各網頁的標題  所以C:\webtitle.txt 的資料也只有最後一筆  所以才會再用p.waitforinpuidle()去等待载入完成   p.waitforexit(1000)等待處理序結束執行

    我可能觀念錯誤  所以昨天在測試時  發現也無法實現我需要的功能   後來大大提示使用backgrandwork

    所以也在努力看範例中

    感謝大大  熱心指導

    2007年6月21日 下午 04:00
  • 大大想請教一下     pinfo.FileName = 檔案名稱或文件

    那我可以指定在我form中的元件 

    可以這樣媽

    想去判斷 FORM中的webbrowser

    感謝

    2007年6月21日 下午 04:14
  • Dear Sir

    那麼這樣看起來不用backgroundworker也是可以做到,你已經知道問題在哪裡,所以像下面這樣應該是可行的

       

    Code Snippet

    ''用來判斷網頁使否載入完成

        Dim IsWebBrowserComplete As Boolean = False

        ''寫入文字檔的資料流

        Dim SW As System.IO.StreamWriter

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            ListBox1.Items.Add("www.yahoo.com.tw")

            ListBox1.Items.Add("www.google.com.tw")

            ListBox1.Items.Add("www.hinet.net")

        End Sub

     

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

            ''預先開啟資料流

            SW = New IO.StreamWriter("C:\Test.txt", False)

            For i As Integer = 0 To ListBox1.Items.Count - 1

                ''將旗標設定為初始值

                IsWebBrowserComplete = False

                WebBrowser1.Navigate(ListBox1.Items(i))

                ''判斷網頁是否載入完成

                Do While Not IsWebBrowserComplete

                    Application.DoEvents()

                    System.Threading.Thread.Sleep(10)

                Loop

                ''寫入文字檔

                SW.WriteLine(WebBrowser1.DocumentTitle)

            Next

            ''關閉資料流

            SW.Flush()

            SW.Close()

            SW.Dispose()

        End Sub

     

        Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

            IsWebBrowserComplete = True

        End Sub

     

    另外,backgroundworker既然已經接觸到了,還是可以參考 馬小玲 大提供的相關資源,一併瞭解一下,一開始不用完全了解的很完整,但是要大概知道這東西是在做甚麼、有甚麼用途;那麼以後寫程式的過程遇到相關問題時就會聯想到有這個東西可以用,那個時候再研究深入一點 ~

    以上,參考看看,希望有幫助。

    2007年6月21日 下午 04:16
    版主
  • 感謝大大  指導解惑

    功能終於實現了

    謝謝

    2007年6月21日 下午 05:54