C#在计算机进入睡眠模式前终止进程
在Windows 10中,我创建了一个在后台运行的进程,该进程在启动时初始化。当电脑进入睡眠状态时,它会使windows崩溃,并给我一个BSOD 我对任何解决方案都持开放态度,但我当前正试图在“挂起”PowerModeChanged事件发生时终止进程。这似乎不足以在机器进入休眠状态之前终止进程,并且机器仍在崩溃。我的PowerModeChanged监听器肯定在工作,它肯定是导致机器崩溃的第二个进程 我对后台流程开发有点陌生,我整天都在尝试不同的方法,但进展甚微。肯定有人有这方面的经验,知道如何解决C#在计算机进入睡眠模式前终止进程,c#,windows-10,background-process,sleep-mode,C#,Windows 10,Background Process,Sleep Mode,在Windows 10中,我创建了一个在后台运行的进程,该进程在启动时初始化。当电脑进入睡眠状态时,它会使windows崩溃,并给我一个BSOD 我对任何解决方案都持开放态度,但我当前正试图在“挂起”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操作系统平台上,当一个人真的想为整个运行的机器运行一个“后台进程”,并让该进程在电源事件(如休眠)中生存时,他们通常将其进程设计为Windows服务 许多流行的应用程序都实现为Windows服务,如Microsoft SQL Server或Windows自己的web服务器(W3SVC) 通过选择创建类型为“Windows服务”的新项目,可以在Visual Studio中构建Windows服务 使用此技术,您将能够响应多个事件,包括以下事件(在
System.ServiceProcess.ServiceBase
中定义):
OnStart(字符串[]参数)
OnStop()
OnPause()
OnContinue()
OnPowerEvent(powerbroadcastatus powerStatus)
OnShutdown()
您可以在此处找到有关构建.NET Windows服务的更多信息:在Windows操作系统平台上,当您确实希望在整个机器运行过程中运行“后台进程”,并且要使该进程在电源事件(如休眠)中生存时,他们通常将其进程设计为Windows服务 许多流行的应用程序都实现为Windows服务,如Microsoft SQL Server或Windows自己的web服务器(W3SVC) 通过选择创建类型为“Windows服务”的新项目,可以在Visual Studio中构建Windows服务 使用此技术,您将能够响应多个事件,包括以下事件(在
System.ServiceProcess.ServiceBase
中定义):
OnStart(字符串[]参数)
OnStop()
OnPause()
OnContinue()
OnPowerEvent(powerbroadcastatus powerStatus)
OnShutdown()
您可以在此处找到有关构建.NET Windows服务的更多信息:尽管您说这是一个“后台进程”,但它似乎实际上是作为前台进程运行的。请解释在启动时如何启动此程序。换句话说,如何调用
Main()
方法?我认为op是指静默应用程序,而不是windows服务或较低级别的系统进程。虽然StartProcess或ProcessStart是windows服务的入口点。但使用此链接可以戳到计算机的眼睛-Doh!已经有一分钟了,OnStart()是服务派生的重载。听起来我在最初的方法中找错了方向,但是为了回答你的问题,我有两个程序,一个运行我放在/Startup/目录中的代码。另一个程序是代码示例中ApplicationPath变量示例的辅助应用程序。我正在更新此文件以使用Windows服务路径。谢谢虽然您说这是一个“后台进程”,但看起来它实际上是作为前台进程运行的。请解释在启动时如何启动此程序。换句话说,如何调用Main()
方法?我认为op是指静默应用程序,而不是windows服务或较低级别的系统进程。虽然StartProcess或ProcessStart是windows服务的入口点。但使用此链接可以戳到计算机的眼睛-Doh!已经有一分钟了,OnStart()是服务派生的重载。听起来我在最初的方法中找错了方向,但是为了回答你的问题,我有两个程序,一个运行我放在/Startup/目录中的代码。另一个程序是代码示例中ApplicationPath变量示例的辅助应用程序。我正在更新此文件以使用Windows服务路径。谢谢