C# Thread 线程

Thread  创建和控制线程,设置其优先级并获取其状态

Thread构造函数接收一个无参数或带一个object类型参数的委托

 1                {
 2                     Console.WriteLine("********ManagedThreadId:{0} {1}********", Thread.CurrentThread.ManagedThreadId.ToString("00"), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
 3                     ParameterizedThreadStart method = o => NoReturnWithParamater(o);
 4                     Thread thread = new Thread(method);
 5                     thread.Start("123");//开启线程,执行委托的内容
 6                 }
 7                 {
 8                     ThreadStart method = DoSomeThing;
 9                     Thread thread = new Thread(method);
10                     thread.Start();//开启线程,执行委托的内容
11                     thread.Suspend();//暂停
12                     thread.Resume();//恢复    
13                     //thread.Abort();
14                     //线程是计算机资源,程序想停下线程,只能向操作系统通知(线程抛异常),
15                     //会有延时/不一定能真的停下来
16                     Thread.ResetAbort();
17                     //1等待
18                     while (thread.ThreadState != System.Threading.ThreadState.Stopped)
19                     {
20                         Thread.Sleep(200);//当前线程休息200ms
21                     }
22                     //2 Join等待
23                     thread.Join();//运行这句代码的线程,等待thread的完成
24                     thread.Join(1000);//最多等待1000ms
25                 }
View Code

线程操作

1、Start()           使线程处于Running状态,线程开始执行

2、Suspend()    挂起线程,或者如果线程已挂起,则不起作用

3、Resume()     继续执行已挂起的线程

4、Abort()、Abort(Object)     调用此方法通常会终止线程

5、ResetAbort()     取消当前线程所请求的 Abort(Object)

6、Sleep(Int32)、Sleep(TimeSpan)    将当前线程挂起指定的时间

7、Join()、Join(Int32)、Join(TimeSpan) 在继续执行程序,阻止调用线程,直到由该实例表示的线程终止或经过了指定时间为止

前后台线程

区别是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束

可以通过设置 IsBackground 属性来更改

1 public static void threadMethod()
2 {
3     Thread.Sleep(3000);
4 }
5 Thread thread = new Thread(threadMethod);
6 // thread.IsBackground = true;
7 thread.Start()
View Code

如果运行上面的代码,程序会等待3秒后退出,如果将注释去掉,将thread设成后台线程,则程序会立即退出
要注意的是,必须在调用Start方法之前设置线程的类型,否则一但线程运行,将无法改变其类型

一般通过Begin...方法运行的线程都是后台线程

线程优先级

高优先级,优先执行,但不代表优先完成  甚至说某些情况下,还有意外发生,不能通过这个来控制线程的执行先后顺序,因为操作系统不需要遵循线程的优先级,线程是计算机资源,程序操作线程,只能向操作系统通知,会有延时/不一定能真的执行

微软文档:

Thread:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.thread?view=netframework-4.8

原文地址:https://www.cnblogs.com/Dewumu/p/11812710.html