0

我知道创建太多线程(线程饥饿)对我的应用程序的性能不利,但我不确定这如何转化为 Async/Await 功能。我了解 Task.Run() 使用 ThreadPool 来执行其代码。另外我读到它并不总是创建一个新线程。

现在我有 3 点我找不到答案:

  1. 我是否需要确保没有太多手动线程或将由 .Net-Framework 管理?

  2. 此代码会导致线程饥饿吗?

    Dim ltsk As List(Of Task)
    For Each pers As Person In ListPerson 'Potentialy big Collection of Objects
       ltsk.Add(Task.Run(Sub() pers.CheckPerson))  'Long running function with own Task.Run() inside
    Next
    Task.WhenAll(ltsk)
    
  3. 这是否会创建一个线程?

    Dim i As Integer = 0
    Task.Run(Sub() i += 1) 'I know its an insane example 
    

我在我的新应用程序中使用类似于我在 (2.) 中要求的代码,并获得超过 90% 的 CPU 使用率。通常当我得到这么高的使用率时,我做错了。

4

1 回答 1

6

任务并行库(其中Task的一部分)有几个启发式方法来防止 CPU 饥饿。此外,Windows 使用动态优先级,这意味着如果您使用线程池线程来执行 CPU 工作,它们将自动以较低的优先级运行。

1. 我是否需要确保没有太多的手动线程或将由 .Net-Framework 管理?

它由框架管理。

2. 这个代码会导致线程饥饿吗?

不。

3.这是否创建了一个线程?

它将一个工作项排队到线程池中。如果线程池的工作量超出了它的能力,它可能会决定创建另一个线程。


如果您正在执行实际的并行处理(CPU 密集型工作),那么您应该考虑使用Parallel或 Parallel LINQ 而不是Task直接使用。

于 2013-06-14T11:58:08.673 回答