2012年8月10日 星期五

.NET(C#):兩個進程防止被終止


我們知道,AppDomain.ProcessExit能監視當前進程的退出,而Process.Exited事件只能監視其他進程的退出。而且如果進程被強制結束AppDomain.ProcessExit不會發生的。綜上事實,我們可以用兩個進程互相監視另一個進程的Process.Exited事件來,然後如果一個進程被結束,另一個進程會重新打開這個程序。

比如示例中兩個程序,mgen_p1,和mgen_p2。一個程序結束後,另一個程序會馬上重新運行被結束的程序。當然如果兩個程序同時被結束,那麼他們會被徹底結束。

image
兩個程序的代碼是類似的,比如其中mgen_p1的代碼:
        static void Main(string[] args)
        {
            Console.WriteLine("mgen_p1正在運行");
            var pros = Process.GetProcessesByName("mgen_p2");
            Process mgen_p2;

            //判斷另一個程序是否在運行
            if (pros.Length == 0)
                run_mgen_p2();
            else
            {
                //設置進程的Exited退出事件
                mgen_p2 = pros[0];
                mgen_p2.EnableRaisingEvents = true;
                mgen_p2.Exited += new EventHandler(process_Exited);
            }


            System.Threading.Thread.Sleep(-1);
        }

        //重新啟動另一個程序
        static void run_mgen_p2()
        {
            var process = new Process();
            process.StartInfo.FileName = "mgen_p2";
            process.EnableRaisingEvents = true;
            process.Exited += new EventHandler(process_Exited);

            process.Start();
        }

        //進程退出事件
        static void process_Exited(object sender, EventArgs e)
        {
            run_mgen_p2();
        }
可以下載源代碼或者示例程序
(此為微軟SkyDrive存檔,請用瀏覽器直接下載,用某些下載工具可能無法下載)
環境:Visual C# 2010 Express

沒有留言:

張貼留言