[英]Start an application or batch file using Windows Service
我制作了一個 C# 應用程序來備份一些文件並將其發送到 FTP 或 Dropbox。 此應用程序適用於服務器。 但有時我的應用程序會以某種方式崩潰或關閉。 它必須始終保持打開狀態。 我以為我可以創建一個 Windows 服務來檢查我的應用程序狀態。 如果我的應用程序關閉再次打開它。 我創建了服務。 我使用Process.Start()
方法再次打開我的應用程序。 但它沒有用。 我更改了代碼以打開一個可以打開我的應用程序的批處理文件。 它也沒有用。 然后我搜索了這種情況。 我了解到 Windows 服務無法從桌面打開應用程序。 我沒有找到解決方案。
是否有任何解決方案,或者是否有任何與 Windows 服務不同的方法可用於再次打開我的應用程序?
對不起,我的英語不好。 謝謝。
一個快速的解決方案是創建一個 exe(Monitor.exe) 來監視您的應用程序進程是否正在運行。 如果沒有啟動您的應用程序。
Monitor.exe 的唯一職責是確保您的主應用程序啟動並運行
您的應用程序絕對沒有理由崩潰。 為此,在啟動時添加對未處理異常的處理
// 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 服務無法從桌面打開應用程序。
這是錯誤的,服務可以在 Windows 上以桌面用戶的身份啟動應用程序。 但是您需要做一些解決方法才能使其正常工作。
問題是 Windows 服務在與 Windows 桌面用戶不同的會話中運行。 他們的互動是不被直接允許的。 這稱為: 會話 0 隔離
您需要做的是,從 Windows 服務“作為桌面用戶”啟動您的桌面應用程序。 Windows 有CreateProcessAsUserA 函數來幫助解決這個問題。
好的,我的代碼在哪里?
這是我非常喜歡這個示例類。 “Impersonation.cs” 因為,它使您可以非常輕松地使用 CreateProcessAsUser 函數。 您可以調用該函數,如:
Impersonation.ExecuteAppAsLoggedOnUser("applicationName", null);
還要確保您向用戶授予替換進程級別令牌權限: https : //defaultreasoning.com/2017/01/16/migration-assistant-error-replace-process-level-token/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.