关于windows服务重启程序的问题,很急,请求帮助

小D2013 2009-02-05 09:17:47
各位,我写了一个windows服务,他监控另外一个应用程序,如果应用程序主窗体挂起,那么我这个服务就会重启他,我这个服务对于测试程序都能把它重启,但是在实际项目中和测试程序不太一样,就是实际项目中在form_load事件中有一个验证,这导致了我的服务不能重启,我加了一些messagebox,具体情况如下

应用程序->进入main->进入构造->进入formload->点关闭-->进入formclosing-->进入formclosed
|
|->点进入死循环->进入main->进入构造->进入formload->进入formclosing-->进入formclosed


我在服务中有如下代码
x.CloseMainWindow();
x.Kill();
x.Close();
Thread.Sleep(60000);
myProcess.Start();
注意当我点击死循环后,监控服务发现后,就会做某些事情如下

点进入死循环->进入main->进入构造->进入formload->进入formclosing-->进入formclosed

但他为什么不按如下顺序进行,如果按下面这个顺序进行,程序就应该没问题了,因为formclosing中进行了一些必要操作

点进入死循环->进入formclosing-->进入formclosed->进入main->进入构造->进入formload

请高手解答


...全文
174 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
小D2013 2009-02-09
  • 打赏
  • 举报
回复
请高手帮帮忙,急
hangang7403 2009-02-08
  • 打赏
  • 举报
回复
up
eynStudio 2009-02-07
  • 打赏
  • 举报
回复
学习。关注。。。
小D2013 2009-02-07
  • 打赏
  • 举报
回复
继续提前,请高手帮忙
小D2013 2009-02-05
  • 打赏
  • 举报
回复
d
小D2013 2009-02-05
  • 打赏
  • 举报
回复
回楼上,这是我在window服务中的代码 ,我突然想到一个问题,是不是根启动用户有关系,这样重新启动后用户名是system,直接点击应用程序是administrator

x.CloseMainWindow();
x.Kill();
x.Close();
Thread.Sleep(60000);
myProcess.Start();
晓轩 2009-02-05
  • 打赏
  • 举报
回复
如果可以监测到被监测程序挂起信号。
kill掉就可以了。
再调用shell重新run一下。


程序挂起是不可能再进行消息循环的。所以只有强制终止或者等他自己唤醒。
小D2013 2009-02-05
  • 打赏
  • 举报
回复
因为我另外做了一个windows服务,是随开机启动的,这个服务会监控我的程序主窗体是否被挂起,如果挂起,服务就会重新启动它
晓轩 2009-02-05
  • 打赏
  • 举报
回复
点进入死循环->//这里执行的是挂起应用程序的事件吗?如果挂起你的应用程序该无响应状态,怎么还会执行事件呢。进入main->进入构造->进入formload->进入formclosing-->进入formclosed
小D2013 2009-02-05
  • 打赏
  • 举报
回复
回楼上,我在界面上加了测试一个按钮,点击执行死循环
晓轩 2009-02-05
  • 打赏
  • 举报
回复
点进入死循环是什么意思?
zhaozhijun0207 2009-02-05
  • 打赏
  • 举报
回复
没做过类似的
小D2013 2009-02-05
  • 打赏
  • 举报
回复
实际的项目比较复杂,用到多线程,在main方法中还有对注册表的验证,如果验证通过则进入formload,我现在又发现了新的问题,以下这个方法在main中运行,如果为真则 Application.Run(new FormMain());

private static bool readRegKey()
{

RegistryKey hklm = Registry.CurrentUser;
//打开"Software"子键
RegistryKey software = hklm.OpenSubKey("Software");
//打开"ddd"子键
RegistryKey no1 = software.OpenSubKey("ddd");
if (no1 == null)
{
return false;
}
//打开"sys"值
String va = (String)no1.GetValue("sys", "0");



bool b = "x".Equals(va);

return b;


}

现在的情况是直接运行主程序会返回真,然后我点击死循环,然后我的监控服务自动重启他,通过捕捉,确实进入了这个readRegKey方法,但no1就等于null了,这是怎么回事,注意我是指通过监控服务重启他
晓轩 2009-02-05
  • 打赏
  • 举报
回复
那你在测试程序里加上验证代码(或者模拟)是否可以重启呢?
小D2013 2009-02-05
  • 打赏
  • 举报
回复
是两个单独的程序,用api ishungwindow
晓轩 2009-02-05
  • 打赏
  • 举报
回复
想问一下,你的服务程序和主程序是两个单独的应用程序对么?
如果是,那你的服务程序怎么接收的主程序挂起信息?

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧