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

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

我确实有一个取消令牌。

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

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

【问题讨论】:

  • (提示:当你为其他系统做大部分等待的事情时,比如数据库调用,最好使用 async/await 而不是线程。)你能提供更多的上下文吗?你的问题?例如 - 代码?通常,线程不是您必须清理的东西。可能您忘记了 using 资源的一些 Disposable 语句。我推荐taking the tour,以及阅读how to ask a good questionwhat'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();
  • 请真正阅读我链接到的文章 - 并编辑您的问题以提供更多信息,同时注意正确的格式。并确保它包含足够的信息。我们无法发现您未提供的代码中的问题。

标签: c# multithreading parallel-processing parallel.foreach


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多