我制作了一个C#应用程序,它备份一些文件并将其发送到FTP或Dropbox。此应用程序在服务器中工作。但有时我的应用程序会以某种方式崩溃或关闭。它必须一直开着。我想我可以做一个Windows服务来检查我的应用程序状态。如果我的应用程序关闭,再次打开它。我创造了这个服务。我再次使用Process.Start()方法打开我的应用程序。但没起作用。我更改了代码以打开一个批处理文件来打开我的应用程序。它也没用。然后我搜索了这个情况。我了解到Windows服务不能从桌面打开应用程序。我没有找到解决办法。
是否有任何解决方案,或有任何不同的方法,我可以使用Windows服务打开我的应用程序?
对不起我的英语不好。谢谢。
发布于 2019-12-17 21:28:14
一个快速的解决方案是创建一个exe(Monitor.exe),以监视应用程序进程是否正在运行。如果没有启动您的应用程序。
Monitor.exe的唯一责任是确保主应用程序的启动和运行。
发布于 2019-12-17 21:57:23
您的应用程序完全没有理由崩溃。为此,在start上添加对未处理异常的处理
// 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
发布于 2019-12-18 08:44:34
我了解到Windows服务不能从桌面打开应用程序。
这是错误的,服务可以启动一个应用程序作为桌面用户的窗口。但是你需要做一些解决办法才能让它发挥作用。
问题是windows服务在与windows桌面用户不同的会话中运行。他们之间的互动是不允许的。这叫做:会话0隔离
您需要做的是,从windows服务中启动桌面应用程序“作为桌面用户”。Windows有CreateProcessAsUserA函数来帮助这方面的工作。
好的,我的密码在哪里?
就是这里我真的很喜欢这个示例类。"Impersonation.cs“,因为它使您很容易使用CreateProcessAsUser函数。您可以像这样调用该函数:
Impersonation.ExecuteAppAsLoggedOnUser("applicationName",为空);
还请确保将替换进程级令牌特权授予用户:https://defaultreasoning.com/2017/01/16/migration-assistant-error-replace-process-level-token/
https://stackoverflow.com/questions/59382215
复制相似问题