亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C# 多线程编程精通:提升性能与效率的核心技术

线程基础

线程是程序的执行路径。每个线程定义唯一的控制流。若应用涉及复杂耗时操作,设置不同执行路径或线程很有帮助,每个线程执行特定任务。

线程是轻量级进程。现代操作系统实现并发编程常用线程。使用线程可节省 CPU 周期,提高应用效率。

此前我们编写的程序中单线程作为单进程运行。但这方式应用一次只能执行一项任务。为使其同时执行多任务,可将其分解为更小的线程。

线程生命周期

线程生命周期始于创建 System.Threading.Thread 类对象,终于线程终止或执行完成。

线程生命周期的各种状态:

主线程

在 C# 中,System.Threading.Thread 类用于处理线程,允许在多线程应用中创建和访问单个线程。进程中第一个执行的线程称为主线程。

C# 程序开始执行时自动创建主线程。使用 Thread 类创建的线程称为主线程的子线程。可通过 Thread 类的 CurrentThread 属性访问线程。

以下程序演示主线程执行:

在线演示
using System;
using System.Threading;
namespace MultithreadingApplication {
    class MainThreadProgram {
        static void Main(string[] args) {
            Thread th = Thread.CurrentThread;
            th.Name = "MainThread";
            Console.WriteLine("This is {0}", th.Name);
            Console.ReadKey();
        }
    }
}

编译执行上述代码,输出结果如下:

This is MainThread

Thread 类的常用属性与方法

常用属性

序号属性与说明
1CurrentContext - 获取线程正在其中执行的当前上下文。
2CurrentCulture - 获取或设置当前线程的区域性。
3CurrentPrinciple - 获取或设置线程的当前主体(基于角色的安全性)。
4CurrentThread - 获取当前正在运行的线程。
5CurrentUICulture - 获取或设置资源管理器在运行时查找区域性特定资源所用的当前区域性。
6ExecutionContext - 获取包含当前线程各种上下文信息的 ExecutionContext 对象。
7IsAlive - 获取指示当前线程执行状态的值。
8IsBackground - 获取或设置指示线程是否为后台线程的值。
9IsThreadPoolThread - 获取指示线程是否属于托管线程池的值。
10ManagedThreadId - 获取当前托管线程的唯一标识符。
11Name - 获取或设置线程名称。
12Priority - 获取或设置线程的调度优先级。
13ThreadState - 获取包含当前线程状态的值。

常用方法

序号方法与说明
1Abort() - 在调用线程上引发 ThreadAbortException 以开始终止线程过程。
2Start() - 启动线程。
3Sleep(int millisecondsTimeout) - 让线程暂停一段时间。
4Join() - 阻塞调用线程直到某线程终止。
5Interrupt() - 中断处于 WaitSleepJoin 状态的线程。
6ResetAbort() - 取消对当前线程的 Abort 请求。
7Yield() - 让调用线程让出执行权给准备好在当前处理器上运行的另一个线程。
8VolatileRead/VolatileWrite - 读写字段值,确保对所有处理器可见。
9MemoryBarrier() - 同步内存访问,防止指令重排序。
10SpinWait(int iterations) - 让线程等待迭代参数定义的次数。

创建线程

通过扩展 Thread 类创建线程。扩展的 Thread 类调用 Start() 方法开始子线程执行。

以下程序演示该概念:

在线演示
using System;
using System.Threading;
namespace MultithreadingApplication {
    class ThreadCreationProgram {
        public static void CallToChildThread() {
            Console.WriteLine("Child thread starts");
        }
        static void Main(string[] args) {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}

编译执行上述代码,输出结果如下:

In Main: Creating the Child thread
Child thread starts

管理线程

Thread 类提供多种管理线程的方法。以下示例演示使用 Sleep() 方法让线程暂停特定时间:

在线演示
using System;
using System.Threading;
namespace MultithreadingApplication {
    class ThreadCreationProgram {
        public static void CallToChildThread() {
            Console.WriteLine("Child thread starts");
            int sleepfor = 5000;
            Console.WriteLine("Child Thread Paused for {0} seconds", sleepfor / 1000);
            Thread.Sleep(sleepfor);
            Console.WriteLine("Child thread resumes");
        }
        static void Main(string[] args) {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}

编译执行上述代码,输出结果如下:

In Main: Creating the Child thread
Child thread starts
Child Thread Paused for 5 seconds
Child thread resumes

销毁线程

Abort() 方法用于销毁线程。运行时通过抛出 ThreadAbortException 中止线程。此异常无法捕获,控制权传递给 finally 块(如有)。

以下程序演示此过程:

在线演示
using System;
using System.Threading;
namespace MultithreadingApplication {
    class ThreadCreationProgram {
        public static void CallToChildThread() {
            try {
                Console.WriteLine("Child thread starts");
                for (int counter = 0; counter <= 10; counter++) {
                    Thread.Sleep(500);
                    Console.WriteLine(counter);
                }
                Console.WriteLine("Child Thread Completed");
            } catch (ThreadAbortException e) {
                Console.WriteLine("Thread Abort Exception");
            } finally {
                Console.WriteLine("Couldn't catch the Thread Exception");
            }
        }
        static void Main(string[] args) {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Thread.Sleep(2000);
            Console.WriteLine("In Main: Aborting the Child thread");
            childThread.Abort();
            Console.ReadKey();
        }
    }
}

编译执行上述代码,输出结果如下:

In Main: Creating the Child thread
Child thread starts
0
1
2
In Main: Aborting the Child thread
Thread Abort Exception
Couldn't catch the Thread Exception

C语言

  1. 选择合适的螺纹处理剂:提升可靠性、减少停机
  2. 缝纫线:类型、历史、生产与质量控制
  3. 解析数字主线:西门子 PLM 智能制造蓝图
  4. 螺纹小径 vs 大径:如何选对螺丝规格
  5. 剪线器/攻丝工具全解:类型、用途与应用场景
  6. 快速背照式光感技术:捕捉超百万帧每秒
  7. Thread与ZigBee:物联网工程师的技术对比
  8. 边缘计算获清晰行业认可框架
  9. 精通 C++ 多线程编程:高效并发开发实战
  10. Python 多线程精通:GIL 详解与实战示例
  11. Python 多线程编程精通:高效并发技术全解析
  12. Java 多线程详解:概念、生命周期与实战代码示例