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();
}
}
private ExternalProcessMonitor _monitor;
private void btnStart_Click(object sender, EventArgs e) {
_monitor = new ExternalProcessMonitor(@"C:\Program Files\CNTV\CBox\CBox.exe");
_monitor.Start();
}
EnableRaisingEvents=true 獲取 Exited 事件。HasExited 和 Responding 屬性,檢測崩潰與假死。try/catch 包裹 Start(),捕獲「文件不存在、權限不足」等啟動異常。C# 監控外部進程:Process 類啟動 + Exited 事件 + Timer 輪詢 HasExited/Responding + 異常捕獲 + 延遲重啟。若需業務級異常(播放卡頓),需客戶端配合暴露狀態接口。