Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 在任务中用红线标出CPU是否智能。运行_.net_Vb.net_Multithreading_Performance_Async Await - Fatal编程技术网

.net 在任务中用红线标出CPU是否智能。运行

.net 在任务中用红线标出CPU是否智能。运行,.net,vb.net,multithreading,performance,async-await,.net,Vb.net,Multithreading,Performance,Async Await,我知道创建太多线程(线程饥饿)对我的应用程序的性能有害,但我不确定这如何转化为异步/等待功能。我知道Task.Run()使用线程池来执行其代码。我还读到它并不总是创建一个新的线程 现在我有三点我找不到答案: 我是否需要确保没有太多的线程是手动的,还是由.Net Framework管理 此代码会导致线程饥饿吗 Dim ltsk As List(Of Task) For Each pers As Person In ListPerson 'Potentialy big Collection of O

我知道创建太多线程(线程饥饿)对我的应用程序的性能有害,但我不确定这如何转化为异步/等待功能。我知道Task.Run()使用线程池来执行其代码。我还读到它并不总是创建一个新的线程

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

  • 我是否需要确保没有太多的线程是手动的,还是由.Net Framework管理

  • 此代码会导致线程饥饿吗

    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.)中要求的代码,CPU使用率超过90%。通常,当我得到如此高的使用率时,我会出错。

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

    一,。我是否需要确保没有太多的线程是手动的,还是由.Net Framework管理

    它由框架管理

    二,。此代码会导致线程饥饿吗

    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 
    
    它将工作项排入线程池队列。如果线程池的工作量超过了它的能力,它可能会决定创建另一个线程


    如果你在做实际的并行处理(CPU密集型工作),那么你应该考虑使用<代码>并行或并行LINQ而不是直接使用<代码>任务。

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

    一,。我是否需要确保没有太多的线程是手动的,还是由.Net Framework管理

    它由框架管理

    二,。此代码会导致线程饥饿吗

    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 
    
    它将工作项排入线程池队列。如果线程池的工作量超过了它的能力,它可能会决定创建另一个线程



    如果你在做实际的并行处理(CPU密集型工作),那么你应该考虑使用<代码>并行< /代码>或并行LINQ而不是直接使用<代码>任务<代码>。使用

    并行
    而不是自己处理
    任务
    到底有什么好处?
    并行
    (和并行LINQ)有许多更高层次的结构,例如“对输入序列执行此操作”、“总结结果”等。使用
    任务
    你必须手工完成所有这些。e、 例如,
    Parallel.ForEach(ListPerson,pers=>pers.CheckPerson())
    Parallel
    和并行LINQ都使用“分区”来提高并行代码的效率。谢谢你为我澄清了一些事情。使用
    并行
    而不是自己处理
    任务
    到底有什么好处?
    并行
    (和并行LINQ)有许多更高层次的结构,例如“对输入序列执行此操作”、“总结结果”等。使用
    任务
    你必须手工完成所有这些。e、 例如,
    Parallel.ForEach(ListPerson,pers=>pers.CheckPerson())
    。并行和并行LINQ都使用“分区”来提高并行代码的效率。