如何在特定时间间隔后运行方法?

很明显:例如,想象一下我的表格中的一个按钮。 当用户单击该按钮时,某些void方法应在30秒后运行。

会有一个DoAfterDelay两个输入参数的void方法DoAfterDelay 。 第一个是要做的方法(使用委托),另一个是时间间隔。 所以我会:

 public delegate void IVoidDelegate(); static void DoAfterDelay(IVoidDelegate TheMethod, TimeSpan Interval) { // *** Some code that will pause the process for "Interval". TheMethod(); } 

所以,我只需要一段代码来暂停特定时间间隔的过程。 到目前为止,我使用此代码执行此操作:

 System.Threading.Thread.Sleep(Interval); 

但是这段代码对我没有好处,因为它会停止整个过程并冻结程序。 我不希望程序卡在DoAfterDelay方法中。 这就是Thread.Sleep没用的原因。

所以有人可以提出更好的方法吗? 当然我已经搜索过了,但我发现的大部分解决方案都是基于使用计时器(比如这里 )。 但是使用计时器是我最后的意见,因为该方法应该运行一次并且使用计时器会使程序混淆阅读。 所以,如果有的话,我正在寻找更好的解决方案。 或许我必须使用计时器?

我想我必须玩线程,但不确定。 所以我想知道是否有人可以指导我找到解决方案。 提前致谢。

你能用任务吗?

  Task.Factory.StartNew(() => { System.Threading.Thread.Sleep(Interval); TheMethod(); }); 

您可以在此处使用.Net 4.5的异步等待function

您可以使用Task.Delay以毫秒为单位给出延迟。 这是一种非常干净的方式。 例如:

  private async void button1_Click(object sender, EventArgs e) { await Task.Delay(5000); TheMethod(); } 

DoAfterDelay启动一个只运行一次的计时器,当它到期时它会调用你的’TheMethod’函数。 为什么会这么乱?

这是你想要的:

  public static void Example1c() { Action action = DoSomethingCool; TimeSpan span = new TimeSpan(0, 0, 0, 5); ThreadStart start = delegate { RunAfterTimespan(action, span); }; Thread t4 = new Thread(start); t4.Start(); MessageBox.Show("Thread has been launched"); } public static void RunAfterTimespan(Action action, TimeSpan span) { Thread.Sleep(span); action(); } private static void DoSomethingCool() { MessageBox.Show("I'm doing something cool"); } 

使用Action的一个好处是可以轻松修改它以传入参数。 假设您希望能够将整数传递给DoSomethingCool。 只需修改即可:

  public static void Example1c() { Action action = DoSomethingCool; TimeSpan span = new TimeSpan(0, 0, 0, 5); int number = 10; ThreadStart start = delegate { RunAfterTimespan(action, span, number); }; Thread t4 = new Thread(start); t4.Start(); MessageBox.Show("Thread has been launched"); } public static void RunAfterTimespan(Action action, TimeSpan span, int number) { Thread.Sleep(span); action(number); } private static void DoSomethingCool(int number) { MessageBox.Show("I'm doing something cool"); } 

非常灵活……

有几种创建线程的方法,但当然,这取决于你在做什么。 您可以像这样动态创建一个线程:

 Thread aNewThread = new Thread( () => OnGoingFunction() ); aNewThread.Start(); 

该线程将在后台运行。 你想要做的function应该有一个睡眠方法,以便在完成处理后进入睡眠状态。 所以这样的事情:

 private void OnGoingFunction() { //Code.... Thread.Sleep(100); //100 ms, this is in the thead so it will not stop your winForm //More code.... } 

我希望有所帮助。

另一种选择是在需要处理它时创建线程,而不用担心睡眠选项。 只需每次加载进程创建一个新线程

你应该创建一个Coroutine

 public IEnumerator waitAndRun() { // WAIT FOR 3 SEC yield return new WaitForSeconds(3); // RUN YOUR CODE HERE ... } 

并称之为:

 StartCoroutine(waitAndRun());