如何统计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
相关产品推荐
相关产品推荐

