在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在学习多线程之前,我们先来看几个概念: 1,什么是进程? 2.什么是线程? 3,什么是多线程? 注意:任何程序在执行时,至少有一个主线程。 一个程序从main开始之后,进程启动,为整个程序提供各种资源,而此时将启动一个线程,这个线程就是主线程,它将调度资源,进行具体的操作。Thread开启的线程是主线程下的子线程,是父子关系,此时该程序即为多线程的,这些线程共同进行资源的调度和执行。
Thread类有几个至关重要的方法,描述如下: 用通俗易懂的话来说,多线程可以让计算机"同时"做多件事情,节约时间。多线程可以让一个程序“同时”处理多个事情。 下面我们通过几个案例来进一步了解多线程
多线程的案例: 案例1:通过多线程执行一个方法 class Program { static void Main(string[] args) { MyClass myClass=new MyClass(); Thread thread=new Thread(new ThreadStart(myClass.MyThread1)); thread.Start(); Console.WriteLine(thread.ThreadState); //注意这里用readline()不能用readkey否则不能出现效果 Console.ReadLine(); } }
class MyClass { public void MyThread1() { Console.WriteLine("大家好,我是线程1"); } } 解释下上述代码,首先在MyClass类中定义一个MyThread1方法,该方法无参数无返回值。然后在Main方法中,通过Thread类创建出一个Thread对象thread,但是其构造函数中需要传入一个委托变量,所以通过new ThreadStart(myClass.MyThread1)创建了一个委托变量,接下就可以通过thread.Start()启动线程,这里需要注意的是,调用thread的Start方法后,线程并不是马上执行,而仅仅是被标记为该线程可以执行了,至于线程何时执行,需要听从cpu的调度。 案例2:带参数的线程启动方法 static void Main(string[] args) { Thread thread=new Thread(new ParameterizedThreadStart(ParameterRun)); string[] strs = {"李小龙","巩俐","范冰冰"}; thread.Start(strs); Console.ReadLine(); } static void ParameterRun(object obj) { Console.WriteLine("我是带参数的线程方法"); string[] arr = obj as string[]; foreach (string s in arr) { Console.WriteLine(s); } } 这个案例和案例1的唯一区别是创建Thread实例时需要一个带参数的委托变量作为构造函数的参数,而且符合委托规范的方法必须没有返回值,且只能有一个参数,并且参数类型是object的。ParameterRun方法参数赋值时,需要在thread.Start()中进行。 当然,在真实的项目中,使用不可能这么简单,但是只要了解清楚了带参数线程的使用方式,再复杂的问题都会迎刃而解。 案例3:模拟摇奖机程序 public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Load += new EventHandler(Form2_Load);//注册事件 }
private Thread thread; //摇奖机是否为启动状态 private bool isStart = false; private void btnok_Click(object sender, EventArgs e) { if (isStart) { btnok.Text = "开始"; isStart = false; } else { btnok.Text = "停止"; isStart = true; //单独开启一个线程摇号,避免主线程假死 thread = new Thread(Show); thread.Start(); } } public void Show() { Random random=new Random(); while (isStart) { lbl1.Text = random.Next(0, 10).ToString(); lbl2.Text = random.Next(0, 10).ToString(); lbl3.Text = random.Next(0, 10).ToString(); //让当前线程睡一会儿 Thread.Sleep(100); } } private void Form1_Load(object sender, EventArgs e) { //不检查控件的跨线程操作 Control.CheckForIllegalCrossThreadCalls = false; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //在窗体关闭(主线程)前关闭子线程 if (thread!=null) { thread.Abort(); } } } 写该程序时,需注意几点: 1, 在窗体的Load事件中设置不检查控件的跨线程操作 2, 在主窗体关闭前,结束子线程的执行 3, 为了避免随机数生活速度过快,使用Thread.Sleep(),让生成随机数的线程休息一段时间 当然,我们讲解的只是多线程的使用方式,如果想要对多线程的底层实现有更深入的了解,还需查询更多书籍和资料。希望这篇文章能对您有所帮助。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论