C#——多线程之Thread

C#------多线程之Thread


前言

上次简单讲述了关于多线程中Task的相关应用以及场景。今天我们来看一下多线程中Thread的使用以及相关注意事项。


一、Thread是什么?

Thread 类是在 .NET Framework 中用于创建和管理线程的基本类。==它允许您在应用程序中创建多个线程,每个线程都可以独立地执行任务。==虽然使用 Thread 类可以实现多线程编程,但在实际开发中,更常用的是使用更高级别的抽象,例如 Task 和异步/等待模式 (async/await),它们提供了更方便和安全的线程管理方式。

一些注意事项与案例:

  1. 前台线程和后台线程
  2. 异步处理
  3. 线程状态及手动销毁线程

二、各应用场景以及实例分析

1.前台线程和后台线程:

默认情况下,线程是前台线程,即使主线程退出,前台线程仍会继续执行(此时当线程中内容是个循环的时候,线程就会一直进行,直到关机)。后台线程则会随着主线程的退出而结束。可以使用 IsBackground 属性来设置线程是否为后台线程。

代码如下(示例):

csharp 复制代码
Thread thread = new Thread(WorkerMethod);
thread.IsBackground = true; // 设置为后台线程
thread.Start();

2.异步处理

同样的,一些耗时的处理,放到线程中进行处理。

代码如下(示例):

csharp 复制代码
        Thread t;
        private void button1_Click(object sender, EventArgs e)
        {
            t = new Thread(thread);
            t.Start();

            Thread t2 = new Thread(new ThreadStart(() =>					//并不会立马执行,也需要用Start进行启动。
            {
                while (true)
                {
                    Console.WriteLine("Thread 2.");
                    Thread.Sleep(1000);
                }
            }));

            t2.Start();
        }
        
        void thread() 
        {
            try
            {
                int num = 0;
                while (true)
                {
                    num += 1;
                    Console.WriteLine($"当前次数{num}");
                    Thread.Sleep(1000);
                }
            }
            catch (ThreadAbortException taEx)
            {
                Console.WriteLine("Thread Abort Exeption!");
            }
            finally 
            {
                Console.WriteLine("Into Finally!");
            }

        }

结果如图:

3.线程状态及手动销毁线程

线程在其生命周期中会处于不同的状态,通过 ThreadState 枚举来表示。

一些常见的线程状态包括:

  • Unstarted:线程已创建但未启动。
  • Running:线程正在运行中。
  • WaitSleepJoin:线程正在等待、睡眠或参与其他线程。
  • Stopped:线程已停止运行。
  • Aborted:线程已被强制终止。

线程销毁:

  • 线程在执行完任务后会自动退出,无需手动销毁。
  • 在必要情况下,可以使用 Abort() 方法强制终止线程的执行,但不推荐使用,因为这样可能会导致资源泄漏或不稳定的状态。

手动销毁线程:

csharp 复制代码
        private void button2_Click(object sender, EventArgs e)
        {
            t.Abort();
        }

Abort() 销毁线程。通过抛出 threadabortexception 在运行时中止线程。代码看2.异步处理处thread()方法。

结果显示:

4.线程同步/等待线程完成

多个线程之间的执行顺序可能会导致意外的结果。使用 Thread.Join() 方法等待线程执行完成。

csharp 复制代码
        Thread t;
        private void button1_Click(object sender, EventArgs e)
        {
            t = new Thread(thread);
            t.IsBackground = true;
            t.Start();
            t.Join();
            Console.WriteLine("End");
        }

        void thread() 
        {
            Console.WriteLine("Will wait 2S");
            Thread.Sleep(2000)
        }

结果显示:

很多时候,线程中的程序是一直循环的,所以无法用join进行等待同步,此时可以在流程中加入全局bool变量去控制流程。


总结

上文我们通过各实例内容,粗略了解了Thread的相关应用,同样的在使用中还会遇见多种问题,在此无法详尽的列举出来。在以后的过程中,如果遇见问题的话我会陆续更新到这里,希望本文对大家有所帮助。下次我们将继续了解Task和Thread的区别及使用时的选择事项。我们下次再见。

相关推荐
weixin_46044356几秒前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
Cc.Y3 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
阿森_dev4 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by209994 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说4 小时前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
Sarvartha4 小时前
Lambda 表达式和函数式接口
java·开发语言
kimloner4 小时前
开源一个 376KB 的 Windows 桌面小工具:便签 + 截图标注 + OCR + 待办提醒(C# / WinForms)
windows·开源·c#·ocr·winforms
小白学大数据4 小时前
拼多多反爬对抗实战:Scrapy 中间件化采集架构解析
开发语言·scrapy·中间件·架构
学逆向的4 小时前
win32注入代码
开发语言·网络安全·api·win32
阿松爱学习5 小时前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#