我尝试验证我的图像 URL 以查看它们是否有效。我有很多这样的人,完成这项任务需要几个小时。因此,我决定异步进行。我想知道执行我的代码是否有任何重大差异或优势,如下所示。
我的主要职能是:
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) 使用异步等待。
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: A task was canceled.]
在调用
myHttpClient.GetAsync
的线路上.我猜它抛出这个异常是因为 ForEach
已结束并请求取消,但 httpclient 尚未完成其工作。如果这可能是最佳解决方案,我该如何处理?或者任何其他使我的工作更快的解决方案。
最佳答案
你肯定不想用 Parallel.ForEach
. Parallel
用于将受 CPU 限制的算法传播到多个内核,这不会给您带来任何好处(在您的场景中,您的算法不受 CPU 限制)。
您真正想要的是并发性,而不是并行性。异步并发可以使用 Task.WhenAll
来完成:
Dim tasks = myImages.Select(Function(x) testUrl_async(x))
Dim results = Await Task.WhenAll(tasks)
关于vb.net - 使用 Parallel.ForEach with/or async/await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31007055/