Обработка исходной странице


Я разработал тест приложение, которое работает на получение исходного кода веб-страниц и обработки. У меня до 100к урлов в очереди и хотите использовать не более 25 нитей. Пожалуйста, помогите мне проверить, если код хорош или указать на любые ошибки вы могли найти.

Public Class frmMain
    Public Delegate Sub AddItemDelegate(ByVal Item As String, ByVal Status As String)
    Private TotalItems As Integer =0

    Public Sub AddItem(ByVal item As String, ByVal status As String)

        If Me.InvokeRequired Then
            Me.Invoke(New AddItemDelegate(AddressOf AddItem), Item, Status)
        Else
            Dim objLock As Object = New Object()
            Dim lvItem As New ListViewItem

            With lvItem
                .Text = Item
                If Status.Length < 200 Then
                    .SubItems.Add(Status)
                Else
                    .SubItems.Add(Status.Length.ToString)
                End If
            End With

            If listView1.Items.Count <TotalItems-1 Then
                listView1.Items.Add(lvItem)
            Else
                tsslstatus.Text ="Done"
                btnStart.Enabled =true
            End If
        End If
    End Sub

    Public Sub DoWork(ByVal objItem As Object)
        static _sem as Semaphore = new Semaphore(5,10)  
        Dim objUrl as String = DirectCast(objItem, string)

        Try
            If objUrl Is Nothing Then
                exit sub
            End If

            Dim URL as New Uri(objUrl)
            _sem.waitone()
            AddItem(URL.AbsoluteUri,gethtml(URL))
            _sem.Release()
        Catch ex As Exception
            debug.Print("Error " & ex.StackTrace )
        End Try
    End Sub

    Private Sub btnStart_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnStart.Click
        btnStart.Enabled =False
        dim blnResult as Boolean = ThreadPool.SetMaxThreads(25, 25)
        System.Threading.Thread.Sleep(1000)
        listView1.Items.Clear

        For Each sItem As String In txturls.Lines
            if sItem.Trim <>string.empty
                ' Queue a task
                If sItem.Contains("http://")=False Then
                    sItem="http://" & sItem
                End If

                ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf DoWork), sItem)
                TotalItems+=1
                tsslTotal.Text =String.Format ("Total Tasks: {0}",TotalItems)
            end if
        Next
    End Sub
End Class


1052
5
задан 27 июня 2011 в 08:06 Источник Поделиться
Комментарии
1 ответ


  • Опираясь на максимальное количество потоков ограничить количество одновременных загрузок кажутся ... неправильными. Это может также вызвать проблемы, если другой компонент нужен пул потоков, в то время как все 25 ждем ответа от веб-сервера.

    (небольшая коррекция), хотя можно использовать семафоры, чтобы ограничить количество одновременных загрузок до десяти, вы еще до 25 потоков пула в метода dowork() метод (15 блокируется на семафоре).

    Два варианта:


    • Управлять вам собственный список задач и потоков (с 4К URL-адреса для каждого потока может занять несколько секунд).

    • Сделайте ваши запросы асинхронно и отслеживать список объекта iasyncresult объекты (хотя это может стать немного неудобный).


  • Я не уверен, что мне нравится идея использовать статический семафор для защиты данных экземпляра, вы должны магазин семафор в местной области. Даже если у вас был только один экземпляр, я предпочитаю сферу замок аналогично данные должны быть защищены. (извините, я думал, что семафор был защитить элементы управления, а не использовать в качестве дросселя)

  • Вы должны освободить свой семафор в блоке finally.

  • Должен быть использован для обновления это только поток, который создал элемент управления. Я рекомендую использовать ISynchronizeInvoke.Вызвать() вызвать метод addItem() (реализуется неявно на контроль). Это также позволит избавиться от необходимости использования семафора для защиты управления (хотя вы все равно должны защитить отложенный список URL-адресов в зависимости от того, что вы делаете по поводу первого пункта). (это уже сделано, к сожалению, пропустил).

  • Какова цель в 1000 миллисекунд сна? он предстает перед нами задачи, даже в очереди.

2
ответ дан 27 июня 2011 в 11:06 Источник Поделиться