使用Parallel.ForEach和/或async / await

时间:2015-06-23 15:28:09

标签: vb.net async-await task-parallel-library 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

1)使用async等待。

For Each myImage In myImages
    Dim result=await testUrl_async(myImageUrl).Result 
    'some code                  
Next

2)使用并行foreach

Parallel.ForEach(myImages, 
    Sub(myImage)
        testUrl(pictureComponent.websiteShop.hqpatronen, myImageUrl) 
        'some code
    End Sub)

3)使用并行foreach和asnyc / await

Parallel.ForEach(myImages, 
    Sub(myImage)
        await testUrl_async(pictureComponent.websiteShop.hqpatronen, myImageUrl) 
    'some code
    End Sub)

第三个可能是最佳解决方案,但它不允许我在Await内拨打Async / ForEach

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

  

[TaskCanceledException:任务被取消。]

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

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

1 个答案:

答案 0 :(得分:9)

您当然不想使用Parallel.ForEachParallel用于在多个内核上传播CPU绑定算法,这样就无法获益(在您的方案中,您的算法不受CPU限制)。

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

完成异步并发
Dim tasks = myImages.Select(Function(x) testUrl_async(x))
Dim results = Await Task.WhenAll(tasks)
相关问题