如何在特定时间间隔后运行方法?
很明显:例如,想象一下我的表格中的一个按钮。 当用户单击该按钮时,某些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());