You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计C#中FileSystemWatcher创建事件启动的活跃线程数

统计自定义启动的活跃线程数

你遇到的问题很常见——System.Diagnostics.Process.GetCurrentProcess().Threads.Count统计的是整个进程的所有线程,包括CLR后台线程、GC线程、线程池线程、UI线程等等,所以完全没法准确反映你自己启动的文件处理线程数量。

要统计仅由FileCreated启动的活跃线程,最简单且线程安全的方式是自己维护一个线程安全的计数器,用Interlocked类来操作(避免多线程下的竞态条件)。具体实现如下:

步骤1:定义线程安全的计数器

在你的类中添加一个静态整数变量,用来跟踪活跃的处理线程数:

private static int _activeProcessingThreads = 0;

步骤2:修改线程创建逻辑

在启动线程前增加计数器,在线程执行完成(包括异常情况)后减少计数器。一定要用try/finally确保计数器一定会被递减,避免因异常导致计数不准确:

private void FileCreated(Object sender, FileSystemEventArgs e) {
    string file_path = e.FullPath;
    string file_name = e.Name;

    // 原子性增加计数器
    Interlocked.Increment(ref _activeProcessingThreads);

    Thread thread = new Thread(() => {
        try {
            processFileThread(file_name, file_path);
        } finally {
            // 无论成功还是失败,都原子性减少计数器
            Interlocked.Decrement(ref _activeProcessingThreads);
        }
    });
    thread.Start();

    // 如需实时获取当前活跃数,用Interlocked.Read保证读取的原子性(32位int在64位系统上读取可能非原子)
    int currentActive = Interlocked.Read(ref _activeProcessingThreads);
    Console.WriteLine($"当前活跃处理线程数:{currentActive}");
}

为什么这个方法可行?

  • Interlocked.Increment和Interlocked.Decrement是原子操作,不会出现多线程同时修改计数器导致的计数错误。
  • 只有你通过FileCreated启动的处理线程会操作这个计数器,完全排除了系统或其他组件创建的线程干扰。

额外提示

FileSystemWatcher的Created事件可能会被重复触发(比如某些应用程序会分多次写入文件,导致多次触发创建事件),如果这会影响你的线程数量统计,可以考虑在processFileThread中先判断文件是否已被处理过,避免重复创建线程。

内容的提问来源于stack exchange,提问作者Sebastian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:42:16