vb.net - 使用 Parallel.ForEach with/or async/await

标签 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 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/AsyncForEach .

如果我使用第二个,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/

相关文章:

mysql - 通过 ssh 隧道连接 vb.net

vb.net - 如何在 VB .net 中以编程方式修复字符串中的括号?

vb.net - 通过链接从网络浏览器启动可执行文件

node.js - NodeJS等待在子进程中不起作用

javascript - 在异步函数中等待多个 promise ,无论如何都会抛出 try catch throws

c# - 如何在不阻塞 UI 线程的情况下使任务超时?

vb.net - 设置 IntelliSense 的默认异常类型

c# - ActionBlock 似乎有时会忽略 MaxDegreeOfParallelism

c# - 任务(异步,等待): Do I need to enter these are all connecting layers or only ones with ASYNC calls i. e HttpClient.GetAsync?