gpt4 book ai didi

vb.net - 使用 "Task.WhenAll"时如何控制线程数

转载 作者:行者123 更新时间:2023-12-03 13:19:38 25 4
gpt4 key购买 nike

我正在通过异步发出 http get 请求来验证图像 url。下面的代码一切正常,但是当我有这么多图像时,我们的防火墙将阻止我的互联网访问,因为有这么多线程同时请求。因此,我一直在寻找一种解决方案,如何限制并发运行的线程数。我最终得到了这个 thread告诉我使用 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

    最佳答案

    our firewall will block my internet access because of so many threads concurrently requesting. Therefore I was looking for a solution how to restrict the count of concurrently running threads.



    很确定防火墙正在限制您的连接数,因此您想限制您的连接数(而不是线程数)。

    is that SemaphoreSlim wait or waitAsnyc (what is the difference anyway?)


    Wait是同步等待 - 它阻塞调用线程。 WaitAsync是一个异步等待 - 它释放调用线程并在信号量可用时恢复执行当前方法。

    should be inside a foreach while adding tasks? Can I just create the task list with linq as I do in my code?



    您可以采用任何一种方式:显式构建一个列表,或者使用 LINQ。

    why is there used task.Run?



    那是那个答案的错误。 Task.Run这里当然不需要或不需要。

    after which line is executed does the thread start? after task.run or task.whenall?



    当您调用 Task.Run ,该委托(delegate)立即排队到线程池。但正如我上面所说,你不想使用 Task.Run (它也不应该在原始答案中使用)。

    所以,这样的事情就足够了:
    Private _mutex As New SemaphoreSlim(20)
    Async Function testUrl_async(myImage As image) As Task(Of image)
    Await _mutex.WaitAsync()
    Try
    Dim myImageurl = myImage.imageurl
    Dim myHttpResponse = Await myHttpClient.GetAsync(myImageurl)
    Return If(myHttpResponse.IsSuccessStatusCode, myImage, Nothing)
    Finally
    _mutex.Release()
    End Try
    End Function

    关于vb.net - 使用 "Task.WhenAll"时如何控制线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31027885/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com