2

基本上我需要我的应用程序从系统启动到系统关闭运行。我想出了以下方法:

  1. 创建 MyApp.exe 和 MyService.exe
  2. MyApp 应该将 MyService 安装为服务
  3. MyService 应该在启动时运行并定期检查 MyApp 是否正在运行。如果不是,那就开始吧。

这是我为我的服务编写的代码:

protected override void OnStart(string[] args)
{
    while(true)
    {
        int processesCount =
            Process.GetProcessesByName(Settings.Default.MyAppName).Count() +
            Process.GetProcessesByName(Settings.Default.MyAppName + ".vshost").Count() +
            Process.GetProcessesByName(Settings.Default.MyAppUpdaterName).Count();

        if(processesCount==0)
        {
            //restore
            var p = new Process { StartInfo = { FileName = Settings.Default.MyAppName, Arguments = "" } };
            p.Start();
        }
        else
        {
        }

        System.Threading.Thread.Sleep(3000);
    }
}
  1. 如何安装此过程以使其在 Windows 启动时启动?
  2. 我不确定 OnStart 方法中的这个无限循环是否是个好主意。是吗?
  3. 总体思路可以吗?
4

2 回答 2

2

我所做的是有一个运行逻辑和主要应用程序代码的 Windows 服务。然后,如果您需要一个 GUI,让 Windows 服务通过 WCF 公开一个 Web 服务,并创建一个调用该 Web 服务的 Windows 应用程序。安装时,将您的 windows 应用程序放在 windows 启动中。

此模型将始终运行主应用程序代码,但 GUI 仅在用户登录时启动。

于 2012-10-20T00:19:54.173 回答
1

总体思路可以吗?

正如汉斯在评论中指出的那样,这对用户是不利的,幸运的是在 Vista 或更高版本上无法运行,因为服务在它们自己的 Windows 站中运行。将您需要始终运行的任何逻辑放入服务中,并使用 IPC 机制(例如 WCF)与(可选)正在运行的 UI 进行通信。如果用户禁用服务或退出 GUI,请尊重他们的意愿......

如何安装此过程以使其在 Windows 启动时启动?

添加一个HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunHKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run指向您的 GUI 应用程序的条目。

我不确定 OnStart 方法中的这个无限循环是否是个好主意。是吗?

否。OnStart如果您需要在 OnStart 返回后执行工作,则需要返回创建一个线程来执行该工作。

于 2012-10-20T00:28:43.483 回答