2014-02-19 74 views
0

,所以我試圖重新編寫這一點,因爲其無法正常工作:需要幫助重寫一個foreach和做,直到環

Private Sub StartTrafficExchange() 

    Dim downloadstring As New StreamReader(Response2.GetResponseStream()) 
    Dim filterstring As String() = downloadstring.ReadToEnd.Split("|") 
    For Each stirngman As String In filterstring 
     linklist.Items.Add(stirngman) 
    Next 

    Do Until linklist.Items.Count = 0 
     Dim rand As New Random 
     linklist.SelectedIndex = rand.Next(0, linklist.Items.Count - 1) 
     Dim strimgna As String = linklist.SelectedItem 
     Dim newlinkstring As String() = strimgna.Split("``") 
     For Each stringma As String In newlinkstring 
      If stringma.Length < 8 Then 
       GoTo a 
      Else 
       LabelX1.Text = "Navigating To " + stringma 
       stringma = stringma.Replace("[TIER4]", "") 
       Debug.WriteLine(stringma) 
       WebKitBrowser1.Navigate(strimgna) 
       Thread.Sleep(15000) 
      End If 
      LabelX1.Text = "Navigating To " + stringma 
      ProgressBarX1.Value += 1 a: 
     Next 
     linklist.Items.Remove(linklist.SelectedItem) 
    Loop 
    ProgressBarX1.Maximum = linklist.Items.Count 
    ProgressBarX1.Value = 0 
    StartTrafficExchange() 
End Sub 

那麼,是什麼代碼呢?那麼它取一個WebRequest的一個鏈接,源會像

http://www.asdfd.com``[TIER4]|http://aesde.com``[TIER4]|http://www.excaedf.com``[TIER4]| 

正如你可以看到上面的代碼第一分裂「|」並將它們分別添加到列表中。 然後,我們分割其他東西,使其成爲一個完美的網址,然後通過webkitbrowser導航到它,並通過使用thread.sleep等待15秒(如果它工作,Idk)。然後將其從鏈接列表中刪除它在foreach中,直到循環。所以有什麼問題 ?那麼它不能正常工作的webkitbrowser只是懸掛。

注意:子窗體加載時調用子StartTrafficExchange()。

有人能告訴我什麼是錯誤的上述代碼,並有任何其他方式來使這項工作?

-Thanks-

+0

它的原因是你的Thread.Sleep()你的webkitbrowser是凍結的 – Deepesh

+0

似乎有很多非常類似的字符串處理來分割數組多次,當一次會很好地做。 –

回答

1

假設linklist不是實際LinkedList,但確實是一個List(Of T)或列表控件的列表中,您可以替換這段代碼:

Dim filterstring As String() = downloadstring.ReadToEnd.Split("|") 
    For Each stirngman As String In filterstring 
     linklist.Items.Add(stirngman) 
    Next 

與此:

它做同樣的事情,只是速度更快,並使用較少的內存消耗。

接下來,把這樣了(像後立即AddRange):

ProgressBarX1.Maximum = linklist.Items.Count 

我要鍵入爲什麼做出各種變化,但這裏是整個套路,我將重構它:

Private Sub StartTrafficExchange() 
    ' Performing one split here that removes everything that needs 
    ' to go will be faster, take less memory, won't have to be 
    ' touched as many times 
    Dim filter As String() = downloadstring.ReadToEnd.Split("``[TIER4]|") 
    linklist.AddRange(filter) 

    ' Set your maximum value so it knows when it is full 
    ProgressBarX1.Maximum = linklist.Items.Count 

    ' Create a counter to let us know how many items 
    ' have been processed 
    Dim counter As Int = 0 
    Dim currentURL As String = String.Empty 

    Do While linklist.Items.Count > 0 
    ' Get the current URL from our list 
    currentURL = linklist.Items(counter) 

    LabelX1.Text = String.Format("Navigating To [TIER4] {0}", currentURL) 
    LabelX1.Refresh() ' Allow the label to update 

    ' This is only good if you have a debugger turned on 
    ' or are running from the IDE 
    Debug.WriteLine(currentURL) 

    WebkitBrowser1.Navigate(currentURL) 

    ' Not a good idea as it will block the UI 
    ' from responding. If you need a delay that 
    ' doesn't appear to lock up the UI, implement 
    ' a timer in a loop 
    Thread.Sleep(15000) 

    ' Increment the counter, then update the progressbar 
    counter += 1 
    ProgressBarX1.Value = counter 
    ProgressBarX1.Refresh() ' Allow the progressbar to update 
    Loop 

    ' When you are through getting all of the URLs, 
    ' clear the list just one time 
    linklist.Items.Clear() 

    ' Make recursive call to this sub 
    ' You should limit the number of recursions 
    ' somehow so you don't run out of stack space 
    StartTrafficExchange 
End Sub 

如果你想與阻塞UI暫停過程中,使用此:

' Create a new timer object that will run for 1/10 of second 
Dim timr As New Timer(100) 

' Run this for 150 times at .1 seconds will 
' give you a 15 second pause and still leave 
' the UI responsive 
For iLoop As Integer = 0 To 150 
    ' Start the timer for .1 seconds 
    timr.Start() 

    ' This tells everything on the form to process updates 
    DoEvents() 
Next 
+0

謝謝隊友。但是,你能否說我如何在循環中實現定時器? –

+0

剛剛做到了。檢查更新。用下面的例子代碼替換這一行'Thread.Sleep(15000)'。 –

+0

比在循環中使用定時器不能作爲新定時器(15000)昏暗timr? –

1

首先,這個不是很重要,但代碼不一致,您使用C#的做法,但你是在VB.NET,然後刪除所有這些+運營商對字符串追加,代之以他們一個&。第二,如果你的目的是等待網頁完全加載,那麼使用Sleep方法是不行的,你需要訂閱像一個WebBrowserDocumentCompleted事件的瀏覽器控件(我不知道確切的事件名稱爲WebKitBrowser

您可以通過編寫一個名爲NavigateAndWait的方法來簡化,並使用它來代替WebKitBrowser.Navigate方法。

我給你一個默認WebBrowser控制的例子:

Private WebPageLoaded As Boolean = False 

''' <summary> 
''' Navigates to an url and waits the page to be loaded. 
''' </summary> 
''' <param name="url">Indicates the url to navigate.</param> 
''' <param name="newWindow">Indicates whether the url should open into a new browser window.</param> 
Private Sub NavigateAndWait(ByVal Browser As WebBrowser, 
          ByVal url As String, 
          Optional newWindow As Boolean = False) 

    Me.WebPageLoaded = False 

    AddHandler Browser.DocumentCompleted, AddressOf WebBrowserDocumentCompleted 
    Browser.Navigate(url, newWindow) 

    Do Until Me.WebPageLoaded 
     Application.DoEvents() 
    Loop 

    RemoveHandler Browser.DocumentCompleted, AddressOf WebBrowserDocumentCompleted 

End Sub 

' WebBrowser [DocumentCompleted] 
Private Sub WebBrowserDocumentCompleted(ByVal sender As Object, e As WebBrowserDocumentCompletedEventArgs) 
    Me.WebPageLoaded = True 
End Sub 

與其他的GeckoFX網頁瀏覽器:

Private WebPageLoaded As Boolean = False 

''' <summary> 
''' Navigates to an url and waits the page to be loaded. 
''' </summary> 
''' <param name="url">Indicates the url to navigate.</param> 
Private Sub NavigateAndWait(Byval Browser as Gecko.GeckoWebBrowser, 
          Byval url As String, 
          Optional loadFlags As Gecko.GeckoLoadFlags = Gecko.GeckoLoadFlags.None, 
          Optional referrer As String = Nothing, 
          Optional postData As Gecko.GeckoMIMEInputStream = Nothing) 

    Me.WebPageLoaded = False 

    AddHandler Browser.DocumentCompleted, AddressOf GeckoWebBrowserDocumentCompleted 
    Browser.Navigate(url, loadFlags, referrer, postData) 

    Do Until Me.WebPageLoaded 
     Application.DoEvents() 
    Loop 

    RemoveHandler Browser.DocumentCompleted, AddressOf GeckoWebBrowserDocumentCompleted 

End Sub 

' GeckoWebBrowser [DocumentCompleted] 
Private Sub GeckoWebBrowserDocumentCompleted(ByVal sender As Object, e As EventArgs) 

    Me.WebPageLoaded = True 

End Sub 
+0

謝謝,但在我的情況下,我只能等待,直到網站加載,但應等待大約15-20秒。 –