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

C# - 多线程

一个线程 定义为程序的执行路径。每个线程定义一个独特的控制流。如果您的应用程序涉及复杂且耗时的操作,那么设置不同的执行路径或线程通常会很有帮助,每个线程执行特定的作业。

线程是轻量级进程 .使用线程的一个常见示例是现代操作系统实现并发编程。使用线程可以节省 CPU 周期的浪费并提高应用程序的效率。

到目前为止,我们编写了将单个线程作为单个进程运行的程序,该进程是应用程序的运行实例。但是,这样应用程序一次可以执行一项工作。为了使其一次执行多个任务,可以将其划分为更小的线程。

线程生命周期

线程的生命周期从创建 System.Threading.Thread 类的对象开始,到线程终止或完成执行结束。

以下是线程生命周期中的各种状态 -

主线程

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

当 C# 程序开始执行时,会自动创建主线程。使用 Thread 创建的线程 类被称为主线程的子线程。您可以使用 CurrentThread 访问线程 Thread 类的属性。

以下程序演示了主线程执行 -

现场演示
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

线程类的属性和方法

下表显示了一些最常用的属性 线程 类-

Sr.No. 属性和描述
1

当前上下文

获取线程正在执行的当前上下文。

2

当前文化

获取或设置当前线程的文化。

3

当前原则

获取或设置线程的当前主体(用于基于角色的安全性)。

4

当前线程

获取当前正在运行的线程。

5

当前的UICulture

获取或设置资源管理器用于在运行时查找特定于区域性的资源的当前区域性。

6

执行上下文

获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。

7

活着

获取一个表示当前线程执行状态的值。

8

是背景

获取或设置一个线程是否为后台线程的值。

9

IsThreadPoolThread

获取一个值,该值指示一个线程是否属于托管线程池。

10

ManagedThreadId

获取当前托管线程的唯一标识符。

11

姓名

获取或设置线程的名称。

12

优先级

获取或设置一个线程的调度优先级值。

13

线程状态

获取一个包含当前线程状态的值。

下表显示了一些最常用的方法 线程 类-

Sr.No. 方法和说明
1

公共无效中止()

在调用它的线程中引发 ThreadAbortException,以开始终止线程的过程。调用此方法通常会终止线程。

2

公共静态 LocalDataStoreSlot AllocateDataSlot()

在所有线程上分配一个未命名的数据槽。为了获得更好的性能,请改用标有 ThreadStaticAttribute 属性的字段。

3

public static LocalDataStoreSlot AllocateNamedDataSlot(字符串名称)

在所有线程上分配一个命名数据槽。为了获得更好的性能,请改用标有 ThreadStaticAttribute 属性的字段。

4

公共静态无效 BeginCriticalRegion()

通知主机执行即将进入一个代码区域,在该区域中线程中止或未处理异常的影响可能会危及应用程序域中的其他任务。

5

公共静态无效 BeginThreadAffinity()

通知主机托管代码即将执行取决于当前物理操作系统线程标识的指令。

6

公共静态无效 EndCriticalRegion()

通知主机执行即将进入代码区域,其中线程中止或未处理异常的影响仅限于当前任务。

7

public static void EndThreadAffinity()

通知主机托管代码已完成执行依赖于当前物理操作系统线程标识的指令。

8

public static void FreeNamedDataSlot(字符串名称)

消除进程中所有线程的名称和插槽之间的关联。为了获得更好的性能,请改用标有 ThreadStaticAttribute 属性的字段。

9

public static Object GetData(LocalDataStoreSlot slot)

从当前线程的当前域内的当前线程上的指定槽中检索值。为了获得更好的性能,请改用标有 ThreadStaticAttribute 属性的字段。

10

公共静态 AppDomain GetDomain()

返回当前线程正在运行的当前域。

11

公共静态 AppDomain GetDomainID()

返回唯一的应用程序域标识符

12

public static LocalDataStoreSlot GetNamedDataSlot(字符串名称)

查找命名数据槽。为了获得更好的性能,请改用标有 ThreadStaticAttribute 属性的字段。

13

公共无效中断()

中断处于 WaitSleepJoin 线程状态的线程。

14

public void Join()

阻塞调用线程直到线程终止,同时继续执行标准 COM 和 SendMessage 泵送。该方法有不同的重载形式。

15

public static void MemoryBarrier()

同步内存访问如下:执行当前线程的处理器不能以这样一种方式重新排序指令,即调用 MemoryBarrier 之前的内存访问在调用 MemoryBarrier 之后的内存访问之后执行。

16

public static void ResetAbort()

取消为当前线程请求的 Abort。

17

public static void SetData(LocalDataStoreSlot slot, Object data)

为该线程的当前域设置当前运行线程上指定槽中的数据。为了获得更好的性能,请改用标有 ThreadStaticAttribute 属性的字段。

18

public void Start()

启动一个线程。

19

公共静态无效睡眠(int毫秒超时)

让线程暂停一段时间。

20

公共静态无效 SpinWait(int 迭代)

使线程等待迭代参数定义的次数

21

公共静态字节 VolatileRead(参考字节地址)

public static double VolatileRead(ref double address)

public static int VolatileRead(ref int address)

public static Object VolatileRead(ref Object address)

读取字段的值。无论处理器的数量或处理器缓存的状态如何,该值都是计算机中任何处理器写入的最新值。此方法具有不同的重载形式。上面只给出了一些。

22

public static void VolatileWrite(ref byte address,byte value)

public static void VolatileWrite(ref double address, double value)

public static void VolatileWrite(ref int address, int value)

public static void VolatileWrite(ref Object address, Object value)

立即将值写入字段,以便计算机中的所有处理器都可以看到该值。此方法具有不同的重载形式。上面只给出了一些。

23

公共静态 bool Yield()

使调用线程让步给准备好在当前处理器上运行的另一个线程。操作系统选择要让步的线程。

创建线程

线程是通过扩展 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");
         
         // the thread is paused for 5000 milliseconds
         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");
            
            // do some work, like counting to 10
            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();
         
         //stop the main thread for some time
         Thread.Sleep(2000);
         
         //now abort the child
         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. 线程 Vs。 ZigBee(物联网工程师)
  4. 分析线程处理选项
  5. Java教程中的多线程与程序和示例
  6. Python 中的多线程示例:在 Python 中学习 GIL
  7. C++ 多线程
  8. Python - 多线程编程
  9. 边缘计算终于有了框架
  10. 背面照明变得更快
  11. 理解数字线程
  12. 什么是剪线器?