如何让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#程序在执行中暂停一段时间的主要内容,如果未能解决你的问题,请参考以下文章

如何让正在运行的线程暂停一段时间

python程序如何让其暂停

如何让cmd命令暂停一段时间后再自动执行

在调试模式下执行控制台应用程序后,如何让 Visual Studio 暂停?

Gtkmm:如何暂停应用程序的执行并等待用户输入?

在Java中,怎么让程序暂停执行,然后按任意键继续执行?