【问题标题】:Start an application or batch file using Windows Service使用 Windows 服务启动应用程序或批处理文件
【发布时间】:2020-04-10 10:15:04
【问题描述】:

我制作了一个 C# 应用程序,用于备份一些文件并将其发送到 FTP 或 Dropbox。此应用程序适用于服务器。但有时我的应用程序会以某种方式崩溃或关闭。它必须始终保持打开状态。我想我可以创建一个 Windows 服务来检查我的应用程序状态。如果我的应用程序关闭,它会再次打开。我创建了服务。我使用Process.Start() 方法再次打开我的应用程序。但它没有用。我更改了代码以打开一个打开我的应用程序的批处理文件。它也没有用。然后我搜索了这种情况。我了解到 Windows 服务无法从桌面打开应用程序。我没有找到解决方案。

是否有任何解决方案,或者是否有任何不同于 Windows 服务的方法可用于再次打开我的应用程序?

对不起,我的英语不好。谢谢。

【问题讨论】:

  • 不能把你的应用做成windows服务应用吗?
  • @Nantharupan Windows 服务无法调用第三方可执行文件。
  • 我的应用程序中有一个用户表单。所以我无法将其转换为 Windows 服务。
  • Windows 服务无法调用任何类型的模式窗口,包括表单,因此您最好创建一个执行监控的控制台应用程序。我不明白为什么这个简单的控制台应用程序会崩溃。

标签: c# windows service backup


【解决方案1】:

一个快速的解决方案是创建一个 exe(Monitor.exe) 来监控您的应用进程是否正在运行。如果不启动您的应用程序。

Monitor.exe 的唯一职责是确保您的主应用程序启动并运行

【讨论】:

  • 其实原因是我选择了一个服务,服务在后台工作。我不确定可执行文件是否一直像服务一样工作。这个 monitor.exe 可以像我的应用程序一样在任何情况下关闭。
  • 服务运行在 Level 0 上,也会有一个与之关联的进程,而且它们也容易出错。您是否检查过您的应用程序崩溃的原因?第三种方法是尝试 Windows Task Scheduler ;)
  • @YusufİslamTek 当然,exe 可以一直运行。您可以在 Windows 上将 exe 作为任务栏应用程序运行,并让一些后台线程执行所有工作并向您的小图标-exe 报告
  • @YusufİslamTek 我猜您仍在寻找解决方案,如果您需要更多帮助,请告诉我们
  • @Clint 我没有机会查看这个解决方案。当我尝试这些方法时,我会立即分享结果。
【解决方案2】:

您的应用程序绝对没有理由崩溃。为此添加对启动时未处理异常的处理

// For service
AppDomain.CurrentDomain.UnhandledException += ...
// For windows forms
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);

那么你的逻辑应该是——你启动你的执行线程,如果那个线程死了,它应该在这里处理

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
    // Log the exception, display it, etc
    // Restart your processor on new thread
    // count number of breakages. If it exceeds certain criteria, like total number,
    // or number per minute, stop service ans send yourself email - 
    // hey your service encounters too many exceptions
}

至于您问题的组成部分 - 在 DLL 中编写您的逻辑,然后您可以在服务或应用程序或其他地方重新使用它

但话虽如此,您的代码应该处理所有异常并防止未处理的异常。而且它可能会根据框架版本有所不同。见HandleProcessCorruptedStateExceptionsAttribute

【讨论】:

  • 感谢这个有用的方法。我会将它添加到我的项目中。我找到了一些 Windows 服务的解决方案,我将尝试它们。如果它们不起作用,我可以按照您所说的创建一个小应用程序。
【解决方案3】:

我了解到 Windows 服务无法从桌面打开应用程序。

这是错误的,服务可以在 Windows 上以桌面用户身份启动应用程序。但是您需要做一些变通方法才能使其正常工作。

问题在于 Windows 服务运行在与 Windows 桌面用户不同的会话中。并且它们的交互是不直接允许的。这叫:Session 0 Isolation

您需要做的是,从 Windows 服务“以桌面用户身份”启动您的桌面应用程序。 Windows 有 CreateProcessAsUserA function 提供帮助。

好的,我的代码在哪里?

Here it is 我真的很喜欢这个示例课程。 “模仿.cs” 因为,它使您可以非常轻松地使用 CreateProcessAsUser 函数。您可以像这样调用函数:

Impersonation.ExecuteAppAsLoggedOnUser("applicationName", null);

还要确保为用户授予替换进程级别令牌权限: https://defaultreasoning.com/2017/01/16/migration-assistant-error-replace-process-level-token/

【讨论】:

  • 我会试试这个并给出结果。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2013-08-26
  • 2013-10-19
  • 2017-08-13
相关资源
最近更新 更多