Vb.net 我需要在已经运行的程序中使用Async/Await,以加快运行速度

Vb.net 我需要在已经运行的程序中使用Async/Await,以加快运行速度,vb.net,asynchronous,async-await,Vb.net,Asynchronous,Async Await,我有一个VB程序,它在网站中搜索图像,如下所示: www.website.com/1.jpg | www.website.com/2.jpg | www.website.com/3.jpg 在循环中,程序在浏览器中只打开3.jpg,因为1和2 jpg不会在服务器中退出。该程序正在启动并运行,但速度非常慢,一分钟内搜索120次左右。然而,我的一位同事用Angular设计了相同的程序,该程序运行速度非常快,一分钟内搜索500/600次左右 他告诉我,他所做的是生成50个到服务器的异步调用,然后再生成

我有一个VB程序,它在网站中搜索图像,如下所示:

www.website.com/1.jpg | www.website.com/2.jpg | www.website.com/3.jpg

在循环中,程序在浏览器中只打开3.jpg,因为1和2 jpg不会在服务器中退出。该程序正在启动并运行,但速度非常慢,一分钟内搜索120次左右。然而,我的一位同事用Angular设计了相同的程序,该程序运行速度非常快,一分钟内搜索500/600次左右

他告诉我,他所做的是生成50个到服务器的异步调用,然后再生成50个,然后再生成50个,继续这样做。从而使他的程序非常快速和精确

我学习并了解到,在VisualBasic中,对服务器请求也有异步和等待调用,但我不知道如何实现

下面是我现有的代码。有人能帮我吗

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim MYURL as string
    itemsF = 0

    While Not itemsF = 50000
        MYURL = "www.website.com/" & itemsF & ".jpg"
        CheckPageExists(MYURL)
        itemsF=itemsF+1
    End While
End Sub

Private Function CheckPageExists(ByVal url As String) As Boolean    
    Dim request As Net.HttpWebRequest
    Dim response As Net.HttpWebResponse

    request = Net.WebRequest.Create(url)
    request.Timeout = 5000

    Try
        response = request.GetResponse()
    Catch ex As Exception
        'IMAGE DOES NOT EXITS
        Exit Function
    End Try

    Process.Start(url)
End Function

首先,您必须使
CheckPageExists
成为
Async
方法:

Private Async Function CheckPageExists(ByVal url As String) As Task(Of Boolean)
    Dim request As Net.HttpWebRequest = Net.WebRequest.Create(url)
    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

            End Using
        End Using
    Catch ex As Exception
        'IMAGE DOES NOT EXITS
        Result = False
    End Try

    Console.WriteLine(url)

    ''Process.Start("chrome.exe", url)
    Return Result
End Function
如您所见,我们使用的不是
GetResponse
,而是
GetResponseAsync
,它本身就是
Async
。这个方法和你以前做的非常相似,我 为了清晰起见,刚刚添加了
Return
语句,并添加了
StreamReader
来阅读您网站的回复

完成此操作后,只需更改
按钮2\u单击
方法即可调用另一个方法,该方法包含您之前所做的所有操作:

Async Function MakeRequests() As Task
    Dim tasks As List(Of Task(Of Boolean)) = New List(Of Task(Of Boolean))
    Dim itemsF As Integer = 5

    For i = 1 To itemsF
        Dim MYURL As String = "http://www.touchegolfschool.com/images/" & i & ".jpg"

        tasks.Add(CheckPageExists(MYURL))
    Next

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

End Function
异步函数MakeRequests()作为任务
将任务设置为列表(属于布尔型任务的列表))=新列表(属于布尔型任务的列表))
Dim itemsF为整数=5
对于i=1至项目sf
将MYURL设置为字符串=”http://www.touchegolfschool.com/images/&i&“.jpg”
添加(CheckPageExists(MYURL))
下一个
While tasks.Select(函数(x)x.Result).Count
主要的变化是添加
任务。选择(函数(x)x.Result)。计数
;你之前看到的是一个请求,但由于返回所需的时间,因此从未返回;告诉主函数等待直到所有请求都有结果,会使应用程序等待响应的时间足够长

这里的主要区别在于
任务的使用


查看有关异步编程的官方文档。

您使用的是哪个版本的.NET?visual studio 2017是的,但您使用的是哪个版本的.NET framework?检查我做了所有这些…但是调试器使用response As Net.HttpWebResponse=wait request.GetResponseAsync和exits函数转到这一行。即使页面存在于服务器上,也不会显示任何内容。我还从任务中删除了“i”。添加(CheckPageExists(MYURL,i))作为“私有函数的参数太多”我这样做了。还有一个问题。我在某处读到。。。1) get_headers()实际上使用get请求,如果您只想知道文件是否存在,则不需要这些请求。改用HEAD我们能用它吗?比如:request.Method=“HEAD”