gpt4 book ai didi

c# - 使用超时终止进程和任何子进程

转载 作者:太空宇宙 更新时间:2023-11-03 21:13:58 25 4
gpt4 key购买 nike

我正在尝试制作一个小程序,该程序将在后台线程上运行 bat 命令 - 这是可行的,但我正在尝试实现超时“安全”。也就是说,如果后台命令挂起,它会在一定时间后终止。运行代码没有问题......一旦它开始我就无法终止该过程。我最终将我的代码添加到这个测试程序中:

public void ExecutePostProcess(string cmd)
{
//...
WriteToDebugTextBox("Executing Threaded Post Process '" + cmd + "'");
//WriteToDebugTextBox() simply writes to a TextBox across threads with a timestamp
var t = new Thread(delegate()
{
var processInfo = new ProcessStartInfo("cmd.exe", "/c " + cmd);
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
processInfo.RedirectStandardError = true;
processInfo.RedirectStandardOutput = true;

var process = Process.Start(processInfo);
process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => WriteToDebugTextBox(e.Data);
process.BeginOutputReadLine();
process.WaitForExit(3000);
process.Close();
//process.Kill();
//process.CloseMainWindow();
WriteToDebugTextBox("Finished Post Process");
});
t.Start();
//...
}

目前我让它运行这个控制台“TestApp”,它看起来像这样:

class Program
{
static void Main(string[] args)
{
int hangTime = int.Parse(args[0]);

Console.WriteLine("This is the TestApp");
Console.WriteLine("TestApp is going to have a little 'sleep' for {0} seconds", hangTime);
Thread.Sleep(hangTime * 1000);
Console.WriteLine("Test App has woken up!");
}
}

我给了 10 秒的挂起时间。进程超时; process.WaitForExit(3000); 这样应该会在 3 秒后放弃并终止。但是,我的 TextBox 的输出始终是这样的:

16:09:22.175 Executing Threaded Post Process 'test.bat'

16:09:22.257 This is the TestApp

16:09:22.261 TestApp is going to have a little 'sleep' for 10 seconds

16:09:25.191 Finished Post Process

16:09:32.257 Test App has woken up!

我已经尝试了来自各地的许多答案,但都无济于事。我如何正确终止进程?

最佳答案

NT Job Object 中开始您的流程.设置 JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE这份工作的工作限制。启动您的流程并将其分配给该作业(通常您创建暂停的流程,将其分配给作业,然后恢复该流程,以防止它在添加之前转义作业上下文)。当时间到了,杀死工作。这样,您不仅可以终止进程,还可以终止您的进程产生的任何子进程,这是您当前尝试中遗漏的重要部分。由于没有托管 NT Jobs API,请查看 Working example of CreateJobObject/SetInformationJobObject pinvoke in .net?

您甚至可以尝试设置 JOB_OBJECT_LIMIT_JOB_TIME 以确保进程在终止之前不会耗尽 CPU/资源。

关于c# - 使用超时终止进程和任何子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35704615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com