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还没有完成它的工作.如果这可能是最佳解决方案,我该如何处理?
或者任何其他使我的工作更快的解决方案.
你当然不想使用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)