我想知道是否有一种方法可以监听事件,以便在特定进程没有响应时(而不是退出时!)得到通知。
此处的此解决方案允许检查某个进程是否响应,但此解决方案只能与轮询一起使用:检查进程状态。如果我能process.Responding
在这个解决方案中“倾听”,那就太好了。
例如,我想监听 Windows 机器上的所有 Visual Studio 进程,如果其中任何一个进程没有响应,那么我希望得到通知,以便我可以相应地对其采取行动。提前谢谢了!
我想知道是否有一种方法可以监听事件,以便在特定进程没有响应时(而不是退出时!)得到通知。
此处的此解决方案允许检查某个进程是否响应,但此解决方案只能与轮询一起使用:检查进程状态。如果我能process.Responding
在这个解决方案中“倾听”,那就太好了。
例如,我想监听 Windows 机器上的所有 Visual Studio 进程,如果其中任何一个进程没有响应,那么我希望得到通知,以便我可以相应地对其采取行动。提前谢谢了!
像这样的东西可以工作。这是一个原始示例,它使用 TasksProcess.Responding
在返回 false 时轮询和触发事件。我认为您无法定期轮询该过程,至少不是以简单/简洁的方式。
每个都Task
将在后台线程中运行,以便在监视每个进程时不会挂起主线程。
using System.Threading.Tasks;
namespace System.Diagnostics
{
public class ProcessEventArgs : EventArgs
{
public Process Process { get; protected set; }
public ProcessEventArgs( Process process )
{
this.Process = process;
}
}
public delegate void ProcessNotRespondingEvent( object sender, ProcessEventArgs e );
public class ProcessMonitor
{
public event ProcessNotRespondingEvent NotResponding;
protected Process mProcess;
public ProcessMonitor( Process process )
{
this.mProcess = process;
}
public async void Start()
{
Task t = null;
t = Task.Run( () =>
{
while( this.mProcess.Responding )
t.Wait( 1000 ); //1 second
this.OnNotResponding();
} );
await t;
}
protected void OnNotResponding()
{
if( this.NotResponding == null )
return;
ProcessEventArgs e = new ProcessEventArgs( this.mProcess );
this.NotResponding( this, e );
}
}
}
示例用法:
using System.Linq;
internal static class Program
{
private static void Main()
{
var processes = Process.GetProcessesByName( "devenv" );
var monitors = processes.Select( p => {
var monitor = new ProcessMonitor( p );
monitor.NotResponding += ( s, e ) => {
Console.WriteLine( "Process {0}(pid: {1}) has stopped responding.", e.Process.ProcessName, e.Process.Id );
};
return monitor;
} );
foreach( var monitor in monitors )
monitor.Start();
}
}