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

2017-10-25 08:23:31来源:CSDN作者:zzulishulei人点击

分享

一、背景

功能需求:定时重启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();    }    /// <summary>    /// 定时操作    /// </summary>    /// <param></param>    /// <param></param>    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;    }    /// <summary>    /// 关闭除了自身以外的所有同名进程    /// </summary>    /// <param></param>    /// <param></param>    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

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台