通过Task.Run重新划分CPU是否智能

时间:2013-06-14 11:38:17

标签: .net vb.net multithreading performance async-await

我知道我的应用程序的性能不利于创建太多线程(threadstarvation),但我不确定这是如何转换为异步/等待功能的。我理解Task.Run()使用ThreadPool来执行其代码。我也读到它并不总是创造一个新的线程。

现在我得到了3分,我找不到答案:

  1. 我是否需要确保手头有很多线程,或者是否由.Net-Framework管理?

  2. 此代码可以导致threadstarvation吗?

    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 
    
  4. 我在我的新应用程序中使用类似于我在(2.)中提出的代码,并获得超过90%的CPU使用率。通常当我得到这么高的用量时,我做错了。

1 个答案:

答案 0 :(得分:6)

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

  

1。我是否需要确保手边有很多线程,或者是否由.Net-Framework管理?

它由框架管理。

  

2。这段代码可以导致threadstarvation吗?

没有

  

3。这会创建一个线程吗?

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


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