Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 侦听另一个应用程序的退出_C#_.net_Events - Fatal编程技术网

C# 侦听另一个应用程序的退出

C# 侦听另一个应用程序的退出,c#,.net,events,C#,.net,Events,在使用C#和.Net时,是否可能在特定Windows应用程序终止/关闭时收到通知?它可以是任何应用程序,即在Windows作业列表中侦听。使用System.Diagnostics是。我以前写过一个程序,它会杀死一个应用程序的两个实例。我认为,当某个特定的程序关闭时,没有事件可以连接起来监视,但您可以定期检查该程序是否仍存在于进程列表中,并在找不到该程序时触发事件 if(!Process.GetProcesses().Any(p => p.ProccessId == Id)); { /

在使用C#和.Net时,是否可能在特定Windows应用程序终止/关闭时收到通知?它可以是任何应用程序,即在Windows作业列表中侦听。

使用System.Diagnostics是。我以前写过一个程序,它会杀死一个应用程序的两个实例。我认为,当某个特定的程序关闭时,没有事件可以连接起来监视,但您可以定期检查该程序是否仍存在于进程列表中,并在找不到该程序时触发事件

   if(!Process.GetProcesses().Any(p => p.ProccessId == Id)); { //or Process Name
      //Your logic here
   }

您可以像这样使用
WaitForExit
方法:

var process = Process.GetProcessById(process_id);

process.WaitForExit();
NotifyOnProcessExits(process, () => Console.WriteLine("Process has exited"));
这将导致执行线程等待进程退出

如果不希望阻止线程,而是希望在进程退出时收到通知,则可以使用以下方法:

public static void NotifyOnProcessExits(Process process, Action action)
{
    Task.Run(() => process.WaitForExit()).ContinueWith(t => action());
}
然后像这样使用它:

var process = Process.GetProcessById(process_id);

process.WaitForExit();
NotifyOnProcessExits(process, () => Console.WriteLine("Process has exited"));

请注意,此解决方案将使一个线程池线程等待进程退出。不过,我不确定您是否能够找到一个真正异步的更好的解决方案。

您可以注册该进程,然后使用

ThreadPool.RegisterWaitForSingleObject
这将允许当前正在执行监视的应用程序按预期运行,而不会被阻止


请参阅。

您可以使用定期检查流程,并查看您的流程是否仍在列表中。我刚刚查看了流程,发现此调用的:流程。退出事件可能会有一个事件。我会尝试使用那个。考虑将TaskFuleToCon源连接到那个事件。