我正在尝试检测进程是否正在响应,我正在使用System.Diagnostics进行此操作
但问题是,当进程没有响应我的表单冻结时,它应该显示消息框中带有“否”,但它只是冻结,而如果进程处于活动状态,则会显示“是”。
这是我到目前为止所做的:
private void timer1_Tick(object sender, EventArgs e)
{
Process[] processes = Process.GetProcessesByName("Anticheat");
foreach (Process p in processes)
{
if (p.Responding)
{
MessageBox.Show("Yes");
}
else
{
MessageBox.Show("No");
}
}
}
是的,我正在用一个每5秒运行一次的计时器来检查它。
答案 0 :(得分:1)
解决方法是使用具有最大等待超时的任务来获取响应
private void timer1_Tick(object sender, EventArgs e)
{
var processes = Process.GetProcessesByName("Anticheat");
foreach (var p in processes)
{
var task = Task.Factory.StartNew(() => p.Responding);
const int maxWaitForResponse = 1000; //ms
var processResponding = task.Wait(maxWaitForResponse) && task.Result;
MessageBox.Show(processResponding ? "Yes" : "No");
}
}