C# Timer仅运行一次问题:进程监控重启脚本失效求助
问题分析与修复方案
你的代码存在两个关键问题,导致Timer无法重复触发应用重启:
Check变量未重置:第一次检测到应用运行后,Check被设为true,但后续检查时没有将其重置为false,导致永远不会进入启动应用的分支。- 重复扫描目录冗余:每次Timer触发都重新扫描目录查找ini文件,这是不必要的重复操作,会浪费系统资源。
另外,遍历进程时可以优化:找到匹配进程后立即终止循环,提升执行效率。
修正后的代码:
private string _appPath; // 存储从ini读取的应用路径,只加载一次 private void Form1_Load() { // 只在启动时扫描一次目录获取ini文件 string rootdir = @"C:\Users\isaced1\Desktop"; var iniFiles = Directory.GetFiles(rootdir, "FileMoverV1.0.ini", SearchOption.AllDirectories); if (iniFiles.Length > 0) { // 读取第一个找到的ini文件内容作为应用路径 _appPath = File.ReadAllText(iniFiles[0]); } // 配置并启动Timer timer1.Interval = 1000; // 测试用1秒,正式环境改为600000(10分钟) timer1.Enabled = true; // 立即执行一次检查 CheckAndStartApp(); } private void timer1_Tick(object sender, EventArgs e) { CheckAndStartApp(); } // 单独提取检查逻辑,便于维护 private void CheckAndStartApp() { bool isAppRunning = false; // 遍历进程检查目标应用 foreach (Process p in Process.GetProcesses()) { if (p.ProcessName.Contains("iTAC")) { isAppRunning = true; button1.Text = "App is Running"; break; // 找到后立即终止循环,提升效率 } } // 如果应用未运行且已获取到启动路径,启动应用 if (!isAppRunning && !string.IsNullOrEmpty(_appPath)) { try { Process.Start(_appPath); button1.Text = "App Started"; } catch (Exception ex) { // 可添加异常处理,比如日志或界面提示 button1.Text = $"Start Failed: {ex.Message}"; } } }
额外说明:
- 将检查逻辑单独封装成
CheckAndStartApp方法,代码结构更清晰易维护。 - 添加了异常捕获,避免启动应用失败时导致程序崩溃。
- 只在启动时读取一次ini文件,避免重复IO操作。
- 确保Timer在
Form1_Load中被启用,或者通过timer1.Start()手动启动。
内容的提问来源于stack exchange,提问作者Katonas
相关产品推荐
相关产品推荐

