如何让C#程序在执行中暂停一段时间
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让C#程序在执行中暂停一段时间相关的知识,希望对你有一定的参考价值。
在线程中,如果要暂停一定的时间,可以使用Thread的Sleep方法,让线程暂停。在微软新的win8API中,已经用Task来实现原来用线程实现的许多功能,同样,Task也有Delay方法,让程序暂停一定的时间。
以下程序利用System.Threading.Timer让程序每隔间隔的时间执行回调方法:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace TimerApp
class Program
static void Main(string[] args)
Console.WriteLine("***** Working with Timer type *****/n");
// Create the delegate for the Timer type.
TimerCallback timeCB = new TimerCallback(PrintTime);
// Establish timer settings.
Timer t = new Timer(
timeCB, // The TimerCallback delegate type.
"Hello From Main", // Any info to pass into the called method (null for no info).
5000, // Amount of time to wait before starting.
Timeout.Infinite); //一秒钟调用一次 Interval of time between calls (in milliseconds).
Console.WriteLine("Hit key to terminate...");
Console.ReadLine();
static void PrintTime(object state)
Console.WriteLine("Time is: 0, Param is: 1",
DateTime.Now.ToLongTimeString(), state.ToString());
如果把时间间隔1000改成 Timeout.Infinite,这样回调方法PrintTime只会在1秒之后调用一次。
除了Threading下有个Timer类之外,.net中还有另一个Timer,就是System.Timer名称空间下的Timer。此Timer的用法和Threading下的Timer不太相同。
System.Timers.Timer t2 = new System.Timers.Timer(100);
t2.Elapsed += t2_Elapsed;
//t1.AutoReset = false;
t2.Enabled = true;
void t2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
其中AutoReset属性的含义是是否在每次时间间隔到了都触发Elapsed事件还是只触发一次(t1.AutoReset = false;)。
解决此类问题的一个小例子(实现在窗体上相隔指定时间显示字幕)
//创建StopNtime类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace 程序运行暂停器
class StopNtime
public StopNtime()
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//,跨线程调用控件必加上去
private int stopTime = 0;//暂停的时间
ThreadStart myStart;
Thread TheStop;
public readonly object MyLockWord = new object();
public void stopWay(int stopTime)
this.stopTime = stopTime;
myStart = new ThreadStart(this .ToStop );
TheStop = new Thread(myStart );
TheStop.Start();
private void ToStop()
lock (MyLockWord)
Thread.Sleep(this .stopTime );
Thread.CurrentThread.Abort();
//主窗体代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading ;
using System.Collections;
namespace 程序运行暂停器
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void Form1_Load(object sender, EventArgs e)
label1.Text = "";
Thread f = new Thread(f1 );
f.Start();
string MyWord = "问题:1+1=? ...\\n答案是:2 ...";
private void f1()
StopNtime mmm = new StopNtime();
foreach (char m in MyWord)
lock (mmm.MyLockWord )
label1.Text += m.ToString();
mmm.stopWay(300);
//运行结果
参考技术A最简单的方法
using System.Threading;// 在想要停顿的地方加上以下语句
Thread.Sleep(1000); // 停顿1000毫秒
Gtkmm:如何暂停应用程序的执行并等待用户输入?
【中文标题】Gtkmm:如何暂停应用程序的执行并等待用户输入?【英文标题】:Gtkmm: How to pause the execution of the application and wait for user input? 【发布时间】:2018-02-09 21:11:02 【问题描述】:我正在寻找一种方法来暂停应用程序的执行,而不会冻结它,并且当用户按下按钮时,它会立即继续它暂停时正在执行的任何操作。
我找不到任何关于此或如何暂停执行一段时间的文档。有人可以帮我解决这个问题吗?
【问题讨论】:
我试过使用这个:people.gnome.org/~gcampagna/docs/GLib-2.0/GLib.usleep.html 以及使用 sleep() commnad,但不是仅仅暂停应用程序,而是使其无响应。我正在尝试做的是使用 GUI 可视化算法的某些部分,但是输出显示速度太快而且很难理解。 暂停到底是什么? UI 应用程序正在运行所谓的“消息泵循环”。你想停止那个循环还是什么? 我正在尝试在解决问题时暂停算法。它向 GUI 发送一些参数,GUI 会显示它们,在这里执行应该暂停。当用户按下按钮时,从该点继续执行。 您的算法应该在工作线程中运行。您可以暂停该线程,但不能暂停主 GUI 线程。即使在暂停状态 UI 也应该有机会在窗口表面上呈现。渲染是在 GUI 线程中进行的,因此不会被阻塞。 我找到了 std::condition_variables 的主题,我认为这可以让我做你描述的事情。非常感谢您提供的信息:) 【参考方案1】:正如您所说的“用户界面”,我建议使用模式对话框。 每个 UI 库都可以选择创建模式对话框。
要求用户在模式对话框中输入。执行等待,直到模态对话框关闭。使用“关闭”或“确定”按钮关闭模态对话框。
【讨论】:
以上是关于如何让C#程序在执行中暂停一段时间的主要内容,如果未能解决你的问题,请参考以下文章