Vb.net 将Parallel.ForEach与/或async/await一起使用
我尝试验证我的图像URL,看看它们是否有效。我有很多这样的任务,完成这项任务需要几个小时。因此,我决定异步执行。我想知道按照下面的方式编写代码是否有很大的区别或优势 我的主要职能是:Vb.net 将Parallel.ForEach与/或async/await一起使用,vb.net,async-await,task-parallel-library,parallel.foreach,Vb.net,Async Await,Task Parallel Library,Parallel.foreach,我尝试验证我的图像URL,看看它们是否有效。我有很多这样的任务,完成这项任务需要几个小时。因此,我决定异步执行。我想知道按照下面的方式编写代码是否有很大的区别或优势 我的主要职能是: Async Function testUrl_async(ByVal myImageurl As String) As Task(Of Boolean) myHttpResponse = Await myHttpClient.GetAsync(myImageurl) If myHttpRespons
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)
第三个可能是最好的解决方案,但它不允许我在ForEach
中调用wait
/Async
如果我使用第二个函数,testurl
函数具有异步http调用,但不使用wait
,否则它会崩溃并显示异常消息:
[TaskCanceledException:任务已取消。]
在调用myHttpClient.GetAsync
的行上。我猜它抛出此异常是因为ForEach
已结束,请求取消,但httpclient尚未完成其工作。如果这是最好的解决方案,我该如何处理
或者任何其他使我的工作更快的解决方案。您肯定不想使用
Parallel.ForEach
Parallel
用于将CPU限制的算法扩展到多个核上,这不会给您带来任何好处(在您的场景中,您的算法不受CPU限制)
您真正想要的是并发性,而不是并行性。异步并发可以使用任务来完成。当所有:
Dim tasks = myImages.Select(Function(x) testUrl_async(x))
Dim results = Await Task.WhenAll(tasks)
对于TPL Dataflow来说,这可能是一个很好的任务,它提供了粗略的Parallel.ForEach功能,支持异步。它是新的,并且只支持4.5及更高版本吗?@batmaci就像async/await
,yes@PanagiotisKanavos关键字是C#的一部分,而不是框架。所有兼容包添加的都是关键字工作所需的框架位。@CoryNelson不完全是,因为async/await
不需要任何额外的IL。即使在C#5中,编译器也会生成一个状态机来处理等待。这就是为什么需要Microsoft.Build
——它实际上改变了项目的构建方式。兼容性软件包不会修改运行时本身,也不会添加任何新的IL。我的第一种方法classic for each和sync await之间的性能(速度)有很大的差异吗?我已经测试过了,这会产生很大的差异。谢谢你的帮助:)你能看看我下面的另一篇文章吗?这篇文章确实与这篇文章有关?我不想问更多的问题,而是创建了一个新的帖子。