在C#中如何在一定时间间隔后启动一个进程?

4

我有一个C# WPF应用程序,在main()方法中,我检查某个条件是否成立,如果是,则运行不同的进程,但是我需要在一定的超时时间后启动该进程。例如:

override OnStartUp()

    {
           if(condition == true)
           {
                ProcessStartInfo p = new ProcessStartInfo("filePath");
                p.Start(); // This should wait for like say 5 seconds and then start.
                  return;   // This will exit the current program.
            }
    }

我可以使用Thread.Sleep()函数,但这会导致当前程序停止运行。

换句话说,我希望当前程序立即终止,然后在5秒后启动新的进程。

谢谢!

这个可行吗?


1
使用“计时器”在X时间段后执行某些操作。 - Servy
1
@Servy:这不可能在当前进程已经终止后引起任何操作。 - Ben Voigt
是的,当前进程必须被终止,仅在新进程等待5秒后才能启动...谢谢。 - user1202434
1
仅供参考...您需要等待的事实表明存在竞态条件。您可能希望考虑消除导致它的错误,而不是试图用胶带修补它。例如,在几乎所有情况下,您都不想等待恰好5秒,而是要等待直到XYZ完成。请等待那个。 - cHao
为了提供替代解决方案,您能否说明为什么需要在5秒等待之前关闭此应用程序。另外,启动的应用程序是否也可以进行修改(例如,您是否拥有源代码并可以更改以接受等待环境变量或类似内容)? - deepee1
5个回答

4
如果第一个进程创建了第三个程序。第一个程序将立即退出,而第三个程序将只是休眠5秒钟,然后将启动您的第二个程序。

那是一个聪明的做法...但编写三个单独的程序并不是真正的选择。谢谢你。 - user1202434
我有这样的印象,即第一个程序退出和第二个程序启动之间必须有一定的时间间隔。如果第二个程序可以立即启动并等待您需要的时间,则Ben Voigt答案中的选项1是正确的选择。这是具有自动更新功能的程序中常见的情况。更新程序必须由程序本身启动,但更新程序在主程序退出之前不能开始覆盖。 - Exulted

3

您有几个选项:

  1. 修改要启动的进程并在那里添加延迟。您甚至可以等待“父进程已结束”而不是固定时间。
  2. 使用Windows内置的计划任务。
  3. 使用睡眠命令然后运行程序的批处理文件。

很遗憾,我认为计划任务无法胜任此项任务。5秒钟的等待时间太短了;如果我没记错,任务计划程序的粒度是一分钟。 - cHao
@cHao:我不知道实际的精度,但API接受秒为单位的粒度:http://msdn.microsoft.com/en-us/library/windows/desktop/aa383967(v=vs.85).aspx - Ben Voigt
嘿,本,你说的“parent has ended”是什么意思?有没有我可以挂钩的事件? - user1202434
1
当进程终止时,进程对象变为已发信号状态,并且相对容易获取到父进程的句柄。 - Ben Voigt

1

您可以使用任务计划程序API并设置一次性任务,在下一个5秒后启动应用程序。优秀的托管包装器:taskscheduler.codeplex.com


0
你需要创建一个新的线程。在这个线程中,你可以使用Thread.Sleep而不会阻塞你的程序。
public class MyThread
{
   public static void DoIt()
   {
      Thread.Sleep(100);
      // DO what you need here
   }
}
override OnStartUp()
{
    if(condition == true)
    {
       ThreadStart myThread = new MyThread(wt.DoIt);
       Thread myThread = new Thread(myThread);
       myThread.Start();
    }
}

它会阻止进程退出,这是问题中列出的要求。 - Ben Voigt

0

WaitOne调用中的那些阻塞。问题要求当前程序结束后才能执行该操作。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接