2015-11-11 28 views
2

使用C#和.Net時特定的Windows應用程序終止/關閉是否可以通知?它可以是任何應用程序,即在Windows作業列表中偵聽。偵聽另一個應用程序的退出

+0

您可以使用[Process.GetProcesses](https://msdn.microsoft.com/en-us/library/system.diagnostics.process.getprocesses(v = vs.110).aspx)定期*檢查進程,並查看您的流程是否仍在列表中。 – Habib

+0

我只是看了一下Process,接下來就是這個調用的事件:Process.Exited Event。我會嘗試那個。 – Sulby

+0

考慮將TaskCompletionSource連接到該事件 –

回答

0

是使用System.Diagnostics。我之前編寫過一個程序會殺死應用程序的雙重實例。我不認爲有一些事件可以連接到特定程序關閉時監視,但是您可以定期檢查程序是否仍然存在於進程列表中,並且即使找不到它也會觸發。

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

可以使用WaitForExit方法是這樣的:

var process = Process.GetProcessById(process_id); 

process.WaitForExit(); 

這將導致執行的線程等到進程已退出。

如果你不想阻塞線程,而是收到通知時,進程已經退出,你可以使用以下命令:

public static void NotifyOnProcessExits(Process process, Action action) 
{ 
    Task.Run(() => process.WaitForExit()).ContinueWith(t => action()); 
} 

而且使用這樣的:

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

請注意,此解決方案將保持一個線程池線程等待進程退出。你也許能夠找到一個真正異步的更好的解決方案,但我不確定。

0

你可以註冊過程,然後通過獲得使用

ThreadPool.RegisterWaitForSingleObject 

這將使您的應用程序,目前正在進行的監測按預期運行事件通知,而不會被阻擋。

請參閱here