我尝试验证我的图片网址,看看它们是否有效。我有这么多人,完成这项任务需要几个小时。因此,我决定异步进行。我想知道我的代码是否有任何重大差异或优势,如下所示。
我的主要职能是:
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还没有完成它的工作。如果这可能是最佳解决方案,我该如何处理?
或者任何其他使我的工作更快的解决方案。
答案 0 :(得分:9)
您当然不想使用Parallel.ForEach
。 Parallel
用于在多个内核上传播CPU绑定算法,这样就无法获益(在您的方案中,您的算法不受CPU限制)。
你真正想要的是并发性,而不是并行性。可以使用Task.WhenAll
:
Dim tasks = myImages.Select(Function(x) testUrl_async(x))
Dim results = Await Task.WhenAll(tasks)