目录
一、涉及到的知识点
在使用线程时,经常会用到Sleep方法,Sleep方法用于将线程挂起指定的时间,时间的单位为毫秒。本实例中将会创建一条线程,并在线程的While循环中使用Sleep方法将线程挂起一秒钟,使线程每隔一秒钟获取一次系统时间,并将系统时间显示到TextBox控件中。
本实例实现时主要用到了多线程技术和线程的Sleep方法。
实例中使用了Lambda表达式,实现了Thread类的构造方法中的ThreadStart委托所约定的方法。
1.Sleep(Int32)方法
将当前线程挂起指定的毫秒数。
public static void Sleep (int millisecondsTimeout);
参数
millisecondsTimeout Int32
挂起线程的毫秒数。 如果 millisecondsTimeout 参数的值为零,则该线程会将其时间片的剩余部分让给任何已经准备好运行的、具有同等优先级的线程。 如果没有其他已经准备好运行的、具有同等优先级的线程,则不会挂起当前线程的执行。
例外
ArgumentOutOfRangeException
超时值为负且不等于 Infinite。
2.Parallel.Invoke方法
详见本作者的其他文章,C#用Parallel.Invoke 方法尽可能并行执行提供的每个线程-CSDN博客 https://blog.csdn.net/wenchm/article/details/135697802?spm=1001.2014.3001.5501
二、 实例:用Sleep方法动态时间
// 使用Sleep方法动态时间
namespace _065
{
public partial class Form1 : Form
{
private Label? label1;
private static TextBox? textBox1;
public Form1()
{
InitializeComponent();
Load += Form1_Load;
}
private void Form1_Load(object? sender, EventArgs e)
{
//
// label1
//
label1 = new Label
{
AutoSize = true,
Location = new Point(12, 8),
Name = "label1",
Size = new Size(188, 17),
TabIndex = 0,
Text = "每秒种获取一次系统时间并显示:"
};
//
// textBox1
//
textBox1 = new TextBox
{
ForeColor = Color.Red,
Location = new Point(12, 29),
Multiline = true,
Name = "textBox1",
Size = new Size(360, 45),
TabIndex = 1
};
//
// Form1
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(384, 86);
Controls.Add(textBox1);
Controls.Add(label1);
Name = "Form1";
StartPosition = FormStartPosition.CenterScreen;
Text = "用Sleep方法动态显示时间";
Sleep_Func();
}
private static void Sleep_Func()
{
Thread th = new( //创建线程对象
() => //使用Lambda表达式
{
while (true) //无限循环
{
Parallel.Invoke(//在窗体线程中执行
() => //使用Lambda表达式
{
textBox1!.Text = //显示系统时间
DateTime.Now.ToString("F");
});
Thread.Sleep(1000); //线程挂起1000毫秒
}
})
{
IsBackground = true //设置线程为后台线程
};
th.Start(); //开始执行线程
}
}
}