Как реализовать Await Task, для более быстрого Web Scrap.Как сделать мой код быстрее? - PullRequest
0 голосов
/ 20 ноября 2018

Это данные на основе метки времени Unix, которые необходимо удалить. Файлы на сервере могут быть 1542688763.png или 1542688763.jpg. поэтому моя система убирает заданную метку времени Unix, одну за другой, и проверяет, существует ли файл. Веб-разработчик сделал то же самое, и его очень быстро. Он сказал мне, что из-за неправильного использования процессов ввода-вывода и процессора, а также из-за неправильного запроса и ожидания кода моя программа работает медленнее. Кто-нибудь может помочь?

Imports System.Net.Http
Imports System.Net
Imports System.IO
Imports System.Threading



Public Class Form1
    Dim VarHoldingUnix As Double
    Dim KotafOund As Integer
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        VarHoldingUnix = ToUnix(Date.Now)
        TextBox1.Text = VarHoldingUnix
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim DRON As Date
        DRON = FromUnix(VarHoldingUnix, 0)
        MsgBox(DRON)
        MsgBox(DateAndTime.Day(DRON))
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Dim ABCD As Task


        While Not KotafOund = TextBox3.Text
            ToolStripLabel1.Text = FromUnix(VarHoldingUnix, 0)
            Application.DoEvents()
            ABCD = MakeRequests(300)
        End While

        MsgBox("END")
        End

    End Sub

    Async Function MakeRequests(noS2find As Integer) As Task

        Dim tasks As List(Of Task(Of Boolean)) = New List(Of Task(Of Boolean))
        Dim tasks2 As List(Of Task(Of Boolean)) = New List(Of Task(Of Boolean))
        Dim itemsF As Integer = noS2find

        Dim DRON As Date
        Dim DronDate As String

        Dim MyYear, MyMonth As String

        DRON = FromUnix(VarHoldingUnix, 0)



        For i = 1 To itemsF
            i = i + 1
            DRON = FromUnix(VarHoldingUnix, 0)
            'DronDate = (DateAndTime.Day(DRON))


            Dim MYURLJPG As String = "https://www.secru.com/img/" & VarHoldingUnix & ".png"
            tasks.Add(CheckPageExists1(MYURLJPG))
            'await Task.Run(() => CheckPageExists1(MYURLJPG));
            Dim MYURLPNG As String = "https://www.secru.com/img/" & VarHoldingUnix & ".jpg"
            tasks2.Add(CheckPageExists2(MYURLPNG))
            'await Task.Run(() => CheckPageExists2(MYURLPNG))

            VarHoldingUnix = VarHoldingUnix - 1
        Next

        While tasks.Select(Function(x) x.Result).Count < tasks.Count
            Thread.Sleep(100)
        End While

        While tasks2.Select(Function(x) x.Result).Count < tasks2.Count
            Thread.Sleep(100)
        End While



    End Function

    Private Async Function CheckPageExists1(ByVal url As String) As Task(Of Boolean)


        Dim request As Net.HttpWebRequest = Net.WebRequest.Create(url)
        request.Method = "HEAD"
        'Dim response As Net.HttpWebResponse
        request.Timeout = 5

        Dim Result As Boolean

        Try
            Using response As HttpWebResponse = Await request.GetResponseAsync.ConfigureAwait(False)
                Using responseReader As New IO.StreamReader(response.GetResponseStream)

                    Dim actualResponse As String = Await responseReader.ReadToEndAsync
                    Result = True
                    KotafOund = KotafOund + 1
                    Process.Start(url)
                End Using
            End Using
        Catch ex As Exception
            'IMAGE DOES NOT EXITS
            Result = False
        End Try

        Return Result

    End Function
    Private Async Function CheckPageExists2(ByVal url As String) As Task(Of Boolean)



        Dim request As Net.HttpWebRequest = Net.WebRequest.Create(url)
        'Dim response As Net.HttpWebResponse
        request.Method = "HEAD"
        request.Timeout = 5

        Dim Result As Boolean

        Try
            Using response As HttpWebResponse = Await request.GetResponseAsync.ConfigureAwait(False)
                Using responseReader As New IO.StreamReader(response.GetResponseStream)

                    Dim actualResponse As String = Await responseReader.ReadToEndAsync
                    Result = True
                    KotafOund = KotafOund + 1
                    Process.Start(url)
                End Using
            End Using
        Catch ex As Exception
            'IMAGE DOES NOT EXITS
            Result = False
        End Try

        Return Result

    End Function

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        VarHoldingUnix = TextBox1.Text

        MsgBox("Confirmed New UNIX-VARIABLE " & VarHoldingUnix)
    End Sub
End Class

Я думаю, что внутри асинхронной функции MakeRequests я должен использовать этот код

While tasks.Select(Function(x) x.Result).Count < tasks.Count
   Await Task.Delay(100)
End While

вместо

While tasks.Select(Function(x) x.Result).Count < tasks.Count
   Thread.Sleep(100)
End While

, но я не получаю идеальный баланс числа миллисекунд, которые я установил в пределах wait (100) сейчас, и

ABCD = MakeRequests(300)

может быть 200 или 2000.

Я не знаю .... вы, ребята, лучше осведомлены

1 Ответ

0 голосов
/ 20 ноября 2018

Вы пробовали это?

Private Async Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

    While Not KotafOund = TextBox3.Text
        ToolStripLabel1.Text = FromUnix(VarHoldingUnix, 0)
        Await MakeRequests(300)
    End While

    MsgBox("END")
    End

End Sub
...