使用Parallel.ForEach和/或async/await

bat*_*aci 3 vb.net task-parallel-library async-await parallel.foreach

我尝试验证我的图片网址,看看它们是否有效.我有这么多人,完成这项任务需要几个小时.因此,我决定异步进行.我想知道我的代码是否有任何重大差异或优势,如下所示.

我的主要职能是:

Async Function testUrl_async(ByVal myImageurl As String) As Task(Of Boolean)

   myHttpResponse = Await myHttpClient.GetAsync(myImageurl)
    If myHttpResponse.IsSuccessStatusCode Then
        mySuccess = True
    Else
        mySuccess = False
    End If

    Return mySuccess
End Function

 Function testUrl(ByVal myImageurl As String) As  Boolean

   myHttpResponse = myHttpClient.GetAsync(myImageurl)
    If myHttpResponse.IsSuccessStatusCode Then
        mySuccess = True
    Else
        mySuccess = False
    End If

    Return mySuccess
End Function
Run Code Online (Sandbox Code Playgroud)

1)使用异步等待.

For Each myImage In myImages
    Dim result=await testUrl_async(myImageUrl).Result 
    'some code                  
Next
Run Code Online (Sandbox Code Playgroud)

2)使用平行foreach

Parallel.ForEach(myImages, 
    Sub(myImage)
        testUrl(pictureComponent.websiteShop.hqpatronen, myImageUrl) 
        'some code
    End Sub)
Run Code Online (Sandbox Code Playgroud)

3)使用并行foreach和asnyc/await

Parallel.ForEach(myImages, 
    Sub(myImage)
        await testUrl_async(pictureComponent.websiteShop.hqpatronen, myImageUrl) 
    'some code
    End Sub)
Run Code Online (Sandbox Code Playgroud)

第三个可能是最好的解决方案,但它不允许我打电话Await/ Async在内ForEach.

如果我使用第二个,该testurl函数具有异步http调用,但不具有Await,因此它与异常消息崩溃:

[TaskCanceledException:任务被取消.]

在线上打电话myHttpClient.GetAsync.我猜它会抛出这个异常,因为ForEach已经结束并且请求取消但是httpclient还没有完成它的工作.如果这可能是最佳解决方案,我该如何处理?

或者任何其他使我的工作更快的解决方案.

Ste*_*ary 9

你当然不想使用Parallel.ForEach.Parallel用于在多个内核上传播CPU绑定算法,这将无法为您提供任何好处(在您的方案中,您的算法不受CPU限制).

你真正想要的是并发性,而不是并行性.异步并发可以使用Task.WhenAll:

Dim tasks = myImages.Select(Function(x) testUrl_async(x))
Dim results = Await Task.WhenAll(tasks)
Run Code Online (Sandbox Code Playgroud)