如果进程花费的时间超过设置的时间间隔但不退出,C# 会做一些事情
Posted
技术标签:
【中文标题】如果进程花费的时间超过设置的时间间隔但不退出,C# 会做一些事情【英文标题】:C# do something if process takes longer than set time interval but not quit 【发布时间】:2022-01-14 18:04:03 【问题描述】:我有一个 .exe 进程,我想等待 2 小时才能完成。但是,如果花费的时间超过 1 小时,我想调用一个函数来发送电子邮件状态,这比平时花费的时间长。如果需要超过一定时间但没有退出进程并仍然等待整整 2 小时,如何调用函数?
我如何调用进程
var proc = System.Diagnostics.Process.Start(exePath, parameterString);
var procExited = proc.WaitForExit(twohourinmilliseconds);
//do something here if taking longer than 1 hour but not quit?
int exitCode = proc.ExitCode;
【问题讨论】:
您可以使用轮询循环来休眠一秒钟,例如检查 proc 状态并重复,而不是调用WaitForExit
,直到达到某个总体超时。
什么是进程被 waitForExit 最大时间杀死的等价物,如果超过 2 小时,我可以说 proc.kill() 吗?
我在 WaitForExit 的文档中没有看到任何迹象表明如果超时到期,进程会被终止,所以实际上你可以将它用于你想做的事情。
@500-InternalServerError 所以即使说我在 WaitForExit 返回后退出了我的 c# 应用程序,该进程仍在运行?
这是我得到的印象,虽然我自己没有测试过。
【参考方案1】:
您可以尝试使用WaitForExit
- WaitForExitAsync 的async
版本(也可以让async
成为日常工作):
var proc = System.Diagnostics.Process.Start(exePath, parameterString);
// Delay for an hour (3_600_000 milliseconds)
Task delay = Task.Delay(3_600_000);
// Asynchronously wait for two possible outcomes:
// 1. process completion
// 2. delay (timeout) completion
if (delay == await Task.WhenAny(proc.WaitForExitAsync(), delay))
// 1 hour passed, but proc is still running
//TODO: Send notification here
else
// process completed before 1 hour passed
如果您不想等待超过 2 小时(7_200_000
毫秒)并且您想在等待 1 小时后发送消息:
var proc = System.Diagnostics.Process.Start(exePath, parameterString);
// We are going to cancel proc after 2 hours (== 7_200_000 milliseconds)
// for its completion
using (CancellationTokenSource cs = new CancellationTokenSource(7_200_000))
Task delay = Task.Delay(3_600_000, cs.Token);
Task exe = proc.WaitForExitAsync(cs.Token);
try
if (delay == await Task.WhenAny(exe, delay))
// 1 hour passed, but proc is still running
//TODO: Send notification here
// Keep on waiting exe
await exe;
// proc succesfully completed; we are within 2 hours timeout
//TODO: implement normal flow here
catch (TaskCanceledException)
// 2 hours passed, proc execution cancelled
//TODO: you pobably want to send another message here
【讨论】:
@Theodor Zoulias:你说的很对,谢谢!另一个await
是必需的:首先我们等待exe
或delay
(如果是delay
则发送消息,我们从WhenAny
获得)然后我们应该继续等待exe
unitil 我们有一个完成或取消以上是关于如果进程花费的时间超过设置的时间间隔但不退出,C# 会做一些事情的主要内容,如果未能解决你的问题,请参考以下文章