Parallel.For循环清理[关闭]

Posted

技术标签:

【中文标题】Parallel.For循环清理[关闭]【英文标题】:Parallel.For loop clean up [closed] 【发布时间】:2021-12-26 20:22:02 【问题描述】:

我是多线程的新手。我有一个 Parallel.For 循环工作得很好!

我确实有一个取消令牌。

我们的 DBA 恰好注意到我有很多活动线程(我正在测试和使用该工具,但它不会在生产中使用)。

无论如何,我开始寻找处理后清理线程的方法,但找不到任何东西。除了cts.Cancel,我还需要清理吗?

【问题讨论】:

(提示:当你为其他系统做大部分等待的事情时,比如数据库调用,最好使用 async/await 而不是线程。)你能提供更多的上下文吗?你的问题?例如 - 代码?通常,线程不是您必须清理的东西。可能您忘记了 using 资源的一些 Disposable 语句。我推荐taking the tour,以及阅读how to ask a good question 和what's on topic。 我的开发网络没有连接到互联网,所以很难复制代码。我在由 queuebackgroundworkitem 调用的 dll 中运行该进程。这是非常基本的 var po = new ParallelOptions(); var cts = new CancellationTokenSource(); po.CancellationToken = cts.Token; Parallel.For(o, page.Count, po, index => CreateObject(page[index]); ); cts.Cancel(); 请真正阅读我链接到的文章 - 并编辑您的问题以提供更多信息,同时注意正确的格式。并确保它包含足够的信息。我们无法发现您未提供的代码中的问题。 【参考方案1】:

Parallel.For/Parallel.ForEach 方法在未配置MaxDegreeOfParallelism 选项时有saturating the ThreadPool 的讨厌习惯。这导致ThreadPool 开始在池中注入新线程,频率约为每秒一个新线程。要控制ThreadPool,只需确保您已使用合理的MaxDegreeOfParallelism 配置并行循环,例如Environment.ProcessorCount

var po = new ParallelOptions()  MaxDegreeOfParallelism = Environment.ProcessorCount ;

仅当您想在循环运行时取消循环时,才需要配置CancellationToken 选项。将其用于清理目的不太可能产生任何效果。

【讨论】:

以上是关于Parallel.For循环清理[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Parallel.For 循环中使用相同的函数委托吗

C#的并发循环(for,foreach,parallel.for,parallel.foreach)对比

VB.NET 在 Parallel.for Synclock 内的嵌套循环中运行 sum 丢失信息

在另一个并行循环中调用函数时,函数中的“pragma omp parallel for”无效

并行循环

Parallel