Vb.net 将Parallel.ForEach与/或async/await一起使用

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

我尝试验证我的图像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)
第三个可能是最好的解决方案,但它不允许我在
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之间的性能(速度)有很大的差异吗?我已经测试过了,这会产生很大的差异。谢谢你的帮助:)你能看看我下面的另一篇文章吗?这篇文章确实与这篇文章有关?我不想问更多的问题,而是创建了一个新的帖子。