首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# WinForms 監控外部視頻客戶端異常並自動重啟:進程監視 + 異常捕獲

     編輯:程式設計綜合問答

需求

  • 按鈕啟動「CBOX 央視影音」客戶端(CBox.exe)。
  • 檢測客戶端**啟動失敗、運行中崩潰、播放異常卡死**。
  • 異常發生時**自動重啟**客戶端。

架構設計

public class ExternalProcessMonitor {
    private Process _process;
    private string _exePath;
    private Timer _watchdogTimer;
    private readonly object _lock = new object();

    public ExternalProcessMonitor(string exePath) {
        _exePath = exePath;
        _watchdogTimer = new Timer(CheckProcess, null, Timeout.Infinite, Timeout.Infinite);
    }

    public void Start() {
        lock (_lock) {
            LaunchProcess();
            _watchdogTimer.Change(5000, 5000);  // 5秒後開始,每5秒檢查
        }
    }

    private void LaunchProcess() {
        try {
            _process = Process.Start(new ProcessStartInfo(_exePath) {
                UseShellExecute = true  // 關聯文件類型、顯示 UI
            });
            // 可選:訂閱 Exit 事件
            _process.EnableRaisingEvents = true;
            _process.Exited += (s, e) => OnProcessExited();
        } catch (Exception ex) {
            Log($"啟動失敗: {ex.Message}");
            ScheduleRestart();
        }
    }

    private void CheckProcess(object state) {
        lock (_lock) {
            if (_process == null || _process.HasExited) {
                OnProcessExited();
                return;
            }
            // 進階:檢測「假死」——主窗口無響應
            if (!_process.Responding) {
                Log("進程無響應,強制重啟");
                ForceRestart();
            }
            // 更進階:檢查特定窗口標題/類名是否存在(播放器窗口)
        }
    }

    private void OnProcessExited() {
        Log($"進程退出,退出碼: {_process?.ExitCode}");
        ScheduleRestart();
    }

    private void ScheduleRestart() {
        // 避免頻繁重啟:指數退避或固定延遲
        Task.Delay(10000).ContinueWith(_ => Start());
    }

    private void ForceRestart() {
        try { _process?.Kill(); } catch { }
        Start();
    }
}

WinForms 集成

private ExternalProcessMonitor _monitor;

private void btnStart_Click(object sender, EventArgs e) {
    _monitor = new ExternalProcessMonitor(@"C:\Program Files\CNTV\CBox\CBox.exe");
    _monitor.Start();
}

關鍵點

  • Process.Start 啟動外部程序,EnableRaisingEvents=true 獲取 Exited 事件。
  • Timer 定期輪詢 HasExited 和 Responding 屬性,檢測崩潰與假死。
  • 異常捕獲:try/catch 包裹 Start(),捕獲「文件不存在、權限不足」等啟動異常。
  • 重啟策略:延遲 + 指數退避,避免故障風暴。
  • 播放異常檢測:若需更深層(如視頻卡頓),需客戶端暴露 API/日誌/共享內存,或用 UI Automation 驗證播放器窗口狀態。

總結

C# 監控外部進程:Process 類啟動 + Exited 事件 + Timer 輪詢 HasExited/Responding + 異常捕獲 + 延遲重啟。若需業務級異常(播放卡頓),需客戶端配合暴露狀態接口。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved