我知道我的应用程序的性能不利于创建太多线程(threadstarvation),但我不确定这是如何转换为异步/等待功能的。我理解Task.Run()使用ThreadPool来执行其代码。我也读到它并不总是创造一个新的线程。
现在我得到了3分,我找不到答案:
我是否需要确保手头有很多线程,或者是否由.Net-Framework管理?
此代码可以导致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)
这会创建一个线程吗?
Dim i As Integer = 0
Task.Run(Sub() i += 1) 'I know its an insane example
我在我的新应用程序中使用类似于我在(2.)中提出的代码,并获得超过90%的CPU使用率。通常当我得到这么高的用量时,我做错了。
答案 0 :(得分:6)
任务并行库(其中Task
是其中的一部分)有几种启发式方法可以防止CPU饥饿。此外,Windows使用动态优先级,这意味着如果您使用线程池线程来执行CPU工作,它们将自动以较低的优先级运行。
1。我是否需要确保手边有很多线程,或者是否由.Net-Framework管理?
它由框架管理。
2。这段代码可以导致threadstarvation吗?
没有
3。这会创建一个线程吗?
它会将工作项排入队列。如果线程池的工作量超出了它的能力,它可能会决定创建另一个线程。
如果您正在进行实际的并行处理(CPU密集型工作),那么您应该考虑直接使用Parallel
或并行LINQ而不是Task
。