c# 守护进程,WPF程序自守护
如何防止wpf程序异常关闭,守护进程是暂时能想到的最好方式。最好是能够一次编码就把守护进程的事情做完。
思路:程序打开时,首先打开守护进程;由守护进程打开主程序;守护进程与主程序间互相守护,任何一个挂了都能自动重启。
实现:Mutex互斥量,守护进程和主程序分别使用不同的互斥量,既可以防止重复打开软件,又可以检测程序是否在运行。
话不多说,直接上代码:
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
/// <summary>
/// 主进程互斥量
/// </summary>
private static System.Threading.Mutex mutex_main;
/// <summary>
/// 守护进程互斥量
/// </summary>
private static System.Threading.Mutex mutex_deamon;
/// <summary>
/// 是否为主进程
/// </summary>
private static bool isMain = false;
/// <summary>
/// 打开监视定时器
/// </summary>
public void RunMonitorTimer()
{
System.Timers.Timer timer = new System.Timers.Timer();
timer.Elapsed += timer_Elapsed;
timer.Interval = 2000;
timer.Start();
}
/// <summary>
/// 打开程序
/// </summary>
/// <param name="arg">参数不为null时打开主进程,否则打开守护进程</param>
public void RunProcess(string arg = null)
{
/* 运行程序,不带参数,打开守护进程 */
Process m_Process = new Process();
m_Process.StartInfo.FileName = Process.GetCurrentProcess().MainModule.FileName;
m_Process.StartInfo.Arguments = arg;
m_Process.Start();
}
protected override void OnStartup(StartupEventArgs e)
{
//根据参数判断开启主进程还是守护进程,守护进程不带参数,主进程带参数
if (e.Args.Length < 1)
{
Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
//守护进程互斥量
mutex_deamon = new System.Threading.Mutex(true, "MUTEX_DEAMON");
if (mutex_deamon.WaitOne(0, false))
{
RunMonitorTimer();
// 显示一个自定义窗体,非主窗体,用于阻塞进程,窗体关闭后,守护进程将关闭
WndDeamon wnd = new WndDeamon();
wnd.ShowDialog();
this.Shutdown();
}
else
{
MessageBox.Show("程序已经在运行!", "提示");
this.Shutdown();
}
}
else
{
isMain = true;
mutex_main = new System.Threading.Mutex(true, "MUTEX_MAIN");
if (mutex_main.WaitOne(0, false))
{
RunMonitorTimer();
base.OnStartup(e);
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
}
else
{
Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
MessageBox.Show("程序已经在运行!", "提示");
this.Shutdown();
}
}
}
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (!isMain)
{
if (mutex_main == null)
{
mutex_main = new System.Threading.Mutex(true, "MUTEX_MAIN");
}
if (mutex_main.WaitOne(0, false))
{
//必须释放mutex,否则将导致mutex被占用,主程序不能允许
mutex_main.Dispose();
mutex_main = null;
RunProcess("main");
}
}
else
{
if (mutex_deamon == null)
{
mutex_deamon = new System.Threading.Mutex(true, "MUTEX_DEAMON");
}
if (mutex_deamon.WaitOne(0, false))
{
mutex_deamon.Dispose();
mutex_deamon = null;
RunProcess();
}
}
}
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
区块链开发公司谈区块链技术如何解决教育行业痛点
在机遇与挑战并存的年代,任何事物的发展都不是单一的,像“区块链”这样的“网红”技术,如果只单单存活在金融领域,那它的价值估计就没有那么值得人期待了。真正有强度的“技术”,它的支撑面是很广泛的。那在教育行业,“区块链”是不是还能稳站地位呢? 区块链技术提供了无限的机会,一些教育机构已经应用了此技术,同时也制定了一些未来几年的计划。教育部门计划应用区块链技术来记录和验证学习成绩、考勤记录、和学位证书。 区块链众所周知它是透明的,安全的和不可改变的。教育机构通过使用这一技术,使整个记录成绩的过程更具成本效益,更加透明和安全。除了效率和安全性,使用区块链技术存储的学术成绩将能够使学生在任何时间任何地点都能直接访问他们的文凭信息而不必担心丢失证书或要求他们的大学重新补发。 现在的教育资源,受制于各自为政的中心化平台,师资、教研成果是无法共享,没有解决个体间信任的开放平台,很难实现全球教育资源的共享配置,很多省会城市,优质教育稀缺,并存在暗箱操作,不透明,不公平。教育永远会受到地域、经济条件等客观或主观因素限制。 在中国的教育体制下,有很多有能力,优秀的老师无法进入正规的学校去授课,他们可能有更好...
-
下一篇
WPF C#之读取并修改App.config文件
原文: WPF C#之读取并修改App.config文件 简单介绍App.config App.config文件一般是存放数据库连接字符串的。 下面来简单介绍一下App.config文件的修改和更新。 1,向项目添加app.config文件 右击项目名称,选择“添加”→“添加新建项”,在出现的“添加新项”对话框中,选择“添加应用程序配置文件”;如果项目以前没有配置文件,则默认的文件名称为“app.config”,单击“确定”。出现在设计器视图中的app.config文件为: 1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 </configuration> 注意:在项目进行编译后,在bin\Debuge文件下,将出现两个配置文件,一个名为“Test.exe.config”,另一个名为“Test.vshost.exe.config”。第一个文件为项目实际使用的配置文件,在程序运行中所做的更改都将被保存于此;第二个文件为原代码“app.config”的同步文件,在程序运行中不会发生...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- 2048小游戏-低调大师作品
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音