如果进程花费的时间超过设置的时间间隔但不退出,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 是必需的:首先我们等待exedelay(如果是delay 则发送消息,我们从WhenAny 获得)然后我们应该继续等待exe unitil 我们有一个完成或取消

以上是关于如果进程花费的时间超过设置的时间间隔但不退出,C# 会做一些事情的主要内容,如果未能解决你的问题,请参考以下文章

从 C# PowerShell cmdlet 返回退出代码

如果当前日期时间超过预定日期时间,如何删除本地通知?

matlab高手,在for循环中,设置每个循环的最大时间,如果超过该时间,跳出本次循环,进入下一次循环。

正则表达式匹配超过 2 个空格但不匹配新行

C# 使用Timer控件设置时间间隔

Android内存回收机制