C# 如何从资源管理的角度处理对Task.Run的多个请求?
我有一些代码需要“触发并忘记”,从某种意义上说,调用代码不需要等待响应 如果我迭代一个循环并在一秒钟内调用它10000次,我会有10000个线程四处游荡,争夺资源吗?我做了一个噩梦,梦见我的机器立刻慢下来爬行 或者,线程池是否管理这些请求,并将它们排队等待解决C# 如何从资源管理的角度处理对Task.Run的多个请求?,c#,.net,multithreading,asynchronous,task-parallel-library,C#,.net,Multithreading,Asynchronous,Task Parallel Library,我有一些代码需要“触发并忘记”,从某种意义上说,调用代码不需要等待响应 如果我迭代一个循环并在一秒钟内调用它10000次,我会有10000个线程四处游荡,争夺资源吗?我做了一个噩梦,梦见我的机器立刻慢下来爬行 或者,线程池是否管理这些请求,并将它们排队等待解决 换句话说,调用Task.Run时,使用Task.Run()做一些愚蠢的事情有多容易?调用Task.Run时,您正在将要在线程池中运行的工作排队。如果您开始一系列工作,可能需要一段时间才能完成,因为您的计算资源有限。在使用Task.Run运
换句话说,调用Task.Run时,使用
Task.Run()
做一些愚蠢的事情有多容易?调用Task.Run时,您正在将要在线程池中运行的工作排队。如果您开始一系列工作,可能需要一段时间才能完成,因为您的计算资源有限。在使用Task.Run运行后台任务时,很容易自责。最好理解场景,并为工作使用正确的工具。如果你想处理大量的背景工作,可以看看TPL、BlockingCollection和并发Collection。生产者/消费者流之类的东西是正确的方向,但这一切都取决于您试图解决的问题。因此,当您调用Task.Run
时,它会创建一个新的任务
,并在任务调度程序上调度它。默认值
。这恰好是ThreadPoolTaskScheduler
,它将该任务排入ThreadPool
队列。ThreadPool
使用一个线程池(出人意料地)缓慢地遍历工作项。ThreadPool
在内部管理自己的线程,并在需要时创建更多线程
关于你的问题:
我会有10000个线程四处游荡,争夺资源吗
否,ThreadPool
通常知道如何有效地管理其线程,并且增长非常缓慢
但是,您将分配大量任务,这些任务将占用空间直到完成。他们还可能保留其他引用(通常是因为捕获),这些引用也会占用资源
顺便说一句,如果不是更安全的
Task.Run
,您将使用Task.Factory.StartNew
并传递TaskCreationOptions。LongRunning
您将创建10000个后台线程 只要尝试一下,线程池的工作原理就会很明显。你用这10000个线程做什么?什么样的工作?那么,你是说我基本上可以相信线程池让我免于麻烦吗?@Deane不是真的。我是说除了线程之外,你不应该这样做。看看TPL dataflow的ActionBlock或者其他更高级别的构造。在这种情况下,我并不在乎工作何时完成,只要它实际完成就行。因此,如果线程池愿意,只要它最终到达线程池,它就可以在线程池上停留几分钟。虽然您可能不想安排一系列任务,但您可能没有以正确的方式完成任务。如果通过调度所有这些任务,您使用的内存超过了需要的内存,导致死锁或内存泄漏,该怎么办?在不重要的事情上以正确的方式解决问题会让你在以后更好地解决重要的事情。