当前位置:首页 > C#学习 > 正文内容

C# 线程类 Thread

小道4年前 (2018-12-22)C#学习4920

使用System.Threading.Thread类可以创建和控制线程。

现在C#已经建议摈弃使用 Suspend, Resume 暂停/恢复线程, 也尽量少用 Abort方法中断一个线程.

建议使用线程的同步手段有:  Mutex、ManualResetEvent、AutoResetEvent, Monitor.

.Net中的线程,可以分为后台线程和前台线程。后台线程与前台线程并没有本质的区别,它们之间唯一的区别就是:后台线程不会防止应用程序的进程被终止掉。就是当前台线程都结束了的时候,整个程序也就结束了,即使还有后台线程正在运行,此时,所有剩余的后台线程都会被停止且不会完成.但是,只要还有一个前台线程没有结束,那么它将阻止程序结束.应用程序进程的存亡由前台线程决定而于后台线程无关.这就是它们的区别.改变线程从前台到后台不会以任何方式改变它在CPU协调程序中的优先级和状态。因为前台后线程与程序进程的优先级无关.下面的代码示例对比了前台线程与后台线程的行为。创建一个前台线程和一个后台线程。前台线程使进程保持运行,直到它完成它的 while 循环。前台线程完成后,进程在后台线程完成它的 while 循环之前终止。

C#中,Thread类有一个IsBackground 的属性.MSDN上对它的解释是:获取或设置一个值,该值指示某个线程是否为后台线程。


使用线程显示当前时间代码:

using System;
using System.Threading;
using System.Windows.Forms;

namespace 多线程
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Thread t;//创建并控制线程,设置其优先级并获取其状态。
        private void button1_Click(object sender, EventArgs e)
        {
            t = new Thread(Time);//实例化 调用Time方法
            t.IsBackground = true;//设置后台线程
            t.Start();//线程已准备好,随时可以开始
        }
        void Time()//方法
        {
            while (true)//循环
            {
                textBox1.AppendText(DateTime.Now + "\r\n");//输出
                Thread.Sleep(1000);//挂起指定时间,毫秒
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;//获取或设置一个值,该值指示是否捕获对错误线程的调用
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (t != null)//判断线程是否为null  如果为null 说明当前没执行
            {
                t.Abort();//在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。
            }
        }
    }
}

输出结果:

image.png

扫描二维码推送至手机访问。

版权声明:本文由小道发布,如需转载请注明出处。

本文链接:https://daobk.com/post/156.html

分享给朋友:

“C# 线程类 Thread” 的相关文章

字符串的处理

字符串的处理

C#中单个字符用单引号包含就是char类型,('a'),单引号中放且只能放一个字符。单个字符也可以表示为字符串,还可以有长度为0的字符串使用s.Length属性来获得字符串中的字符个数string可以看做是char的只读数组。char c = s[1];。C#中字符串有一个重要的特性...

字符串的分割:从日期字符串("2008-08-08")中分析出年、月、日;

字符串的分割:从日期字符串("2008-08-08")中分析出年、月、日;

string[] Split(params char[] separator):将字符串按照指定的分割符分割为字符串数组;string[] Split(char[] separator, StringSplitOptions options)将字符串按照指定的char分割符分割为字符串数组( opt...

构造函数

构造函数

构造函数用来创建对象,并且可以在构造函数中对对象进行初始化。构造函数是用来创建对象的特殊函数,函数名和类名一样,没有返回值,连void都不用。构造函数可以有参数,new对象的时候传递函数参数即可构造函数可以重载,也就是有多个参数不同的构造函数。如果不指定构造函数,则类有一个默认的无参构造函数。如果指...

对象的引用

对象的引用

int、decimal、bool、byte等基础类型(值类型)是传递拷贝;对象(引用类型)则是传递引用。(引用类型包括:类、数组、接口、string)因为基础类型不怎么占内存,而对象则比较占内存。    class Program  &n...