WPF中,定时系统重启功能的实现

一、背景

功能需求:定时重启WPF应用,类似于windows的定时重启功能。

二、核心知识点

相关的知识点主要有3个:
1. 定时操作:DispatcherTimer类
2. 系统重启: System.Windows.Forms.Application.Restart();
3. 关闭已启动的应用:Process.CloseMainWindow();

三、代码示例

public partial class App : Application
{

    Process currentProcess;//当前进程
    DispatcherTimer timer = new DispatcherTimer();//定义全局的定时器

    public App()
    {
        currentProcess = Process.GetCurrentProcess();
        timer.Interval = new TimeSpan(0, 0, 5);//测试每5秒执行一次
        timer.Tick += Timer_Tick;
        timer.Start();
    }

    /// 
    /// 定时操作
    /// 
    /// 
    /// 
    private void Timer_Tick(object sender, EventArgs e)
    {
        System.Windows.Forms.Application.Restart();
        Application.Current.Shutdown();
    }

    protected override void OnStartup(StartupEventArgs e)
    {
        KillExeExceptSelf(currentProcess.ProcessName,currentProcess.Id);
    }

    protected override void OnExit(ExitEventArgs e)
    {
        timer.Stop();
        timer = null;
    }

    /// 
    /// 关闭除了自身以外的所有同名进程
    /// 
    /// 
    /// 
    public  void KillExeExceptSelf(string exePath ,int exceptId )
    {
        try
        {
            foreach (var item in Process.GetProcessesByName(exePath).Where(p=>p.Id != exceptId))
            {
                item.CloseMainWindow();
            }
        }
        catch (Exception ex)
        {

        }
    }

}

说明:
1. System.Windows.Forms.Application.Restart();只是重新启动了一个应用程序,并没有关闭已打开的应用,所有还需要使用Application.Current.Shutdown();
2. 每个进程拥有唯一的ID,所以可以通过Process.GetCurrentProcess()获取当前线程,利用Process.GetProcessesByName(exePath).Where(p=>p.Id != exceptId)查找到所有的同名线程并过滤自身,然后使用CloseMainWindow()关闭线程。

四、代码下载

https://github.com/saylorMan/RestartApp

你可能感兴趣的:(WPF,.NET)