在 C# 中一次计算活动线程

Posted

技术标签:

【中文标题】在 C# 中一次计算活动线程【英文标题】:Count the active threads at a time in C# 【发布时间】:2018-09-01 17:19:32 【问题描述】:

我正在使用 fileSystemWatcher 和 Created 事件侦听器,我正在启动一个新线程来处理文件内容并执行一些耗时的操作。代码如下

    fileSystemWatcher = new FileSystemWatcher(folderToWatchFor);
    fileSystemWatcher.EnableRaisingEvents = true;       
    fileSystemWatcher.Created += new FileSystemEventHandler(FileCreated);

    private void FileCreated(Object sender, FileSystemEventArgs e)
    

        string file_path = e.FullPath;
        string file_name = e.Name;
        Thread thread = new Thread(() => processFileThread(file_name, file_path));
        thread.Start();
        //count the active threads here??
    

我喜欢获取活动线程数,以查看一次有多少活动线程,为此我使用了

System.Diagnostics.Process.GetCurrentProcess().Threads.Count

但它为我返回了不同的计数。就像我只是复制了 1 个文件,所以只有 1 个线程处于活动状态,但上面的代码返回 23。

那么我如何计算函数 FileCreated() 中启动的活动线程

【问题讨论】:

创建一个静态变量,让每个线程在启动时将变量加一,在结束时将其减一。 @MichaelPuckettII 是的,这会起作用。但是想知道 .Net 框架支持任何此类功能吗? 检查这个答案。 ***.com/a/3069769/1356478 您将获得更高的数字,因为 .NET 框架会自动启动各种后台线程。例如。线程池,可能是垃圾收集器等的线程池。 你是调试你的代码还是让它自己运行? Visual Studio 和调试器将启动几个线程。 【参考方案1】:

System.Diagnostics.Process.GetCurrentProcess().Threads.Count

将为您的应用程序返回所有线程。 没有直接的可能性只获得您自己的线程。在操作系统线程之上是 .net 框架本身的线程(因此线程数很高)。

如果您使用静态变量,请务必实现锁定/互锁,因为多线程访问。

private int _threadCounter = 0;
private object _threadCounterLock = new object();

lock(_threadCounterLock)
  _threadCounter++;

【讨论】:

以上是关于在 C# 中一次计算活动线程的主要内容,如果未能解决你的问题,请参考以下文章

C#窗体 WinForm 进程,线程

如何在 C# 中一次播放多个声音

根据其他字段的计算,在 pandas 数据框中一次创建两个新字段

进程线程和协程

J.U.C:线程基本概念

J.U.C:线程基本概念