C# UDP远程服务端关闭指定进程异常:误杀进程问题排查
解决UDP服务端中进程关闭的误匹配问题
问题根源
当前代码用process.ProcessName.StartsWith(processName)做进程名匹配,这是前缀匹配逻辑,会误关闭所有进程名以目标字符串开头的程序(比如指定"calc"时,进程名是"calctool"的程序也会被误杀)。另外错误处理里的字符串插值存在语法错误,无法正确输出异常信息。
修复方案
- 精确匹配进程名:用
string.Equals做完全匹配,同时指定忽略大小写(Windows系统下进程名不区分大小写) - 优化进程查询:直接调用
Process.GetProcessesByName获取目标进程,避免遍历系统所有进程,提升效率 - 修复异常日志:修正字符串插值的语法错误,确保异常信息能正确输出
修改后的代码
private void CloseApplications(string[] processNames) { foreach (string processName in processNames) { // 直接获取指定名称的进程,避免遍历所有进程 foreach (Process process in Process.GetProcessesByName(processName)) { try { // 精确匹配进程名,忽略大小写 if (string.Equals(process.ProcessName, processName, StringComparison.OrdinalIgnoreCase)) { if (!process.HasExited) { process.Kill(); UpdateLabel2("Exit"); } } } catch (Win32Exception ex) { UpdateLabel2($"Win32Exception: {ex.Message}"); } catch (Exception ex) { // 修复字符串插值语法,添加$符号 UpdateLabel2($"종료 실패: {ex.Message}"); } } } }
额外说明
Process.GetProcessesByName会自动忽略.exe后缀,传入"calc"就能匹配"calc.exe"的进程,符合常规使用需求StringComparison.OrdinalIgnoreCase确保跨场景的大小写一致性,避免因进程名大小写差异导致匹配失败- 仅遍历目标进程而非系统所有进程,减少系统资源占用,同时降低访问无权限系统进程时的异常触发频率
内容的提问来源于stack exchange,提问作者HOON
相关产品推荐
相关产品推荐

