相关疑难解决方法(0)

使用“Task.WhenAll”时如何控制线程数

我正在通过异步发出 http get 请求来验证图像 url。使用下面的代码一切正常,但是当我有这么多图像时,我们的防火墙将阻止我的互联网访问,因为同时请求的线程太多。因此,我正在寻找如何限制并发运行线程数的解决方案。我结束了这个线程告诉我使用 SemaphoreSlim但不知何故我无法理解这个想法以及如何实现它?

  • 在添加任务时,SemaphoreSlim wait 或 waitAsnyc(有什么区别?)应该在 foreach 内?我可以像在代码中一样使用 linq 创建任务列表吗?
    • 为什么要使用task.Run?
    • 线程在哪一行执行之后开始?在 task.run 或 task.whenall 之后?

如果这不是最好的方法,请提出更好的方法。我不确定将 MaxDegreeOfParallelism 与 parallel.foreach 一起使用是否也有意义?

  Dim tasks = myImages.Select(Function(x) testUrl_async(x))
  Dim results = Await Task.WhenAll(tasks)

Async Function testUrl_async(ByVal myImage  As image) As Task(Of image)
   Dim myImageurl as string=myImage.imageurl
   myHttpResponse = Await myHttpClient.GetAsync(myImageurl)
    If myHttpResponse.IsSuccessStatusCode Then
        Return myImage
    Else
        Return Nothing
    End If
End Function
Run Code Online (Sandbox Code Playgroud)

vb.net multithreading semaphore async-await

2
推荐指数
1
解决办法
1255
查看次数

标签 统计

async-await ×1

multithreading ×1

semaphore ×1

vb.net ×1