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

C# Timer仅运行一次问题:进程监控重启脚本失效求助

问题分析与修复方案

你的代码存在两个关键问题,导致Timer无法重复触发应用重启:

  1. Check变量未重置:第一次检测到应用运行后,Check被设为true,但后续检查时没有将其重置为false,导致永远不会进入启动应用的分支。
  2. 重复扫描目录冗余:每次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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:15:16