C# 在计算机进入睡眠模式之前终止进程
C# Kill process before computer enters sleep mode
在 Windows 10 中,我创建了一个 运行 在启动时初始化的后台进程。当计算机进入睡眠状态时,它会崩溃 windows 并给我一个 BSOD。
我对任何解决方案都持开放态度,但我目前正试图在 'Suspend' PowerModeChanged 事件发生时终止进程。这似乎不足以在机器进入休眠状态之前终止进程,并且机器仍在崩溃。我的 PowerModeChanged 侦听器肯定在工作,并且它肯定是导致机器崩溃的辅助进程。
我对后台进程开发有点陌生,一整天都在尝试不同的方法,但进展不大。当然有人必须有这方面的经验并且知道修复方法。
// Application path and command line arguments
static string ApplicationPath = @"C:\path\to\program.exe";
static Process ProcessObj = new Process();
static void Main(string[] args)
{
SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
startProcess();
Console.ReadKey();
}
static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
Console.WriteLine(e.Mode.ToString());
if (e.Mode == PowerModes.Suspend)
{
ProcessObj.Kill();
}
if (e.Mode == PowerModes.Resume)
{
startProcess();
}
}
static void startProcess()
{
// Create a new process object
try
{
// StartInfo contains the startup information of the new process
ProcessObj.StartInfo.FileName = ApplicationPath;
// These two optional flags ensure that no DOS window appears
ProcessObj.StartInfo.UseShellExecute = false;
ProcessObj.StartInfo.CreateNoWindow = true;
// This ensures that you get the output from the DOS application
ProcessObj.StartInfo.RedirectStandardOutput = true;
// Start the process
ProcessObj.Start();
// Wait that the process exits
ProcessObj.WaitForExit();
// Now read the output of the DOS application
string Result = ProcessObj.StandardOutput.ReadToEnd();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
在 Windows OS 平台上,当一个人真正想要 运行 一个 "background process" 整个机器 运行ning,并且让该进程在电源事件(例如休眠)中存活下来,他们通常将他们的进程构建为 Windows 服务。
许多流行的应用程序都是作为 Windows 服务实现的,例如 Microsoft SQL 服务器,或 Window 自己的网络服务器 (W3SVC)。
Windows 服务可以在 Visual Studio 中构建,方法是选择创建类型为 "Windows Service".
的新项目
使用此技术,您将能够响应多个事件,包括以下事件(在 System.ServiceProcess.ServiceBase
中定义):
OnStart(string[] args)
OnStop()
OnPause()
OnContinue()
OnPowerEvent(PowerBroadcastStatus powerStatus)
OnShutdown()
您可以在此处找到有关构建 .NET Windows 服务的更多信息:https://docs.microsoft.com/en-us/dotnet/framework/windows-services/
在 Windows 10 中,我创建了一个 运行 在启动时初始化的后台进程。当计算机进入睡眠状态时,它会崩溃 windows 并给我一个 BSOD。
我对任何解决方案都持开放态度,但我目前正试图在 'Suspend' PowerModeChanged 事件发生时终止进程。这似乎不足以在机器进入休眠状态之前终止进程,并且机器仍在崩溃。我的 PowerModeChanged 侦听器肯定在工作,并且它肯定是导致机器崩溃的辅助进程。
我对后台进程开发有点陌生,一整天都在尝试不同的方法,但进展不大。当然有人必须有这方面的经验并且知道修复方法。
// Application path and command line arguments
static string ApplicationPath = @"C:\path\to\program.exe";
static Process ProcessObj = new Process();
static void Main(string[] args)
{
SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(SystemEvents_PowerModeChanged);
startProcess();
Console.ReadKey();
}
static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
Console.WriteLine(e.Mode.ToString());
if (e.Mode == PowerModes.Suspend)
{
ProcessObj.Kill();
}
if (e.Mode == PowerModes.Resume)
{
startProcess();
}
}
static void startProcess()
{
// Create a new process object
try
{
// StartInfo contains the startup information of the new process
ProcessObj.StartInfo.FileName = ApplicationPath;
// These two optional flags ensure that no DOS window appears
ProcessObj.StartInfo.UseShellExecute = false;
ProcessObj.StartInfo.CreateNoWindow = true;
// This ensures that you get the output from the DOS application
ProcessObj.StartInfo.RedirectStandardOutput = true;
// Start the process
ProcessObj.Start();
// Wait that the process exits
ProcessObj.WaitForExit();
// Now read the output of the DOS application
string Result = ProcessObj.StandardOutput.ReadToEnd();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
在 Windows OS 平台上,当一个人真正想要 运行 一个 "background process" 整个机器 运行ning,并且让该进程在电源事件(例如休眠)中存活下来,他们通常将他们的进程构建为 Windows 服务。
许多流行的应用程序都是作为 Windows 服务实现的,例如 Microsoft SQL 服务器,或 Window 自己的网络服务器 (W3SVC)。
Windows 服务可以在 Visual Studio 中构建,方法是选择创建类型为 "Windows Service".
的新项目使用此技术,您将能够响应多个事件,包括以下事件(在 System.ServiceProcess.ServiceBase
中定义):
OnStart(string[] args)
OnStop()
OnPause()
OnContinue()
OnPowerEvent(PowerBroadcastStatus powerStatus)
OnShutdown()
您可以在此处找到有关构建 .NET Windows 服务的更多信息:https://docs.microsoft.com/en-us/dotnet/framework/windows-services/