聚化网网站,西宁网站设计高端,个人网页怎么制作,开源企业cms建站系统C#线程学习#xff0c;线程的创建#xff0c;线程的暂停#xff0c;线程的锁lock,Monitor#xff0c;线程使用中的注意事项#xff08;一#xff09;
八股文
线程和进程
进程是指程序的一次执行过程#xff0c;而线程是指进程中执行的一条单一逻辑控制流。 进程是由多…C#线程学习线程的创建线程的暂停线程的锁lock,Monitor线程使用中的注意事项一
八股文
线程和进程
进程是指程序的一次执行过程而线程是指进程中执行的一条单一逻辑控制流。 进程是由多个线程组成的一个进程至少有一个线程叫做主线程。可以在任务管理器中查看有几个线程几个进程。 C#中的线程不支持获取返回值如果想获取返回时需要使用task
Foreground线程和Background线程
Foreground默认的 只要有一个Foregournd线程在执行应用程序就不会关闭。Background线程则不是程序一旦退出Background立刻关闭。通过IsBackground查看属性
注意事项
异常捕获代码应该写在线程代码的内部而不是调用的位置同一个变量如果在两个线程修改那么另外一个也会修改不同的线程是共享全局变量的
代码
线程的创建线程间的变量共享线程中使用lock进行锁解决线程中变量共享的问题线程中使用Monitor进行锁解决线程中变量共享的问题
using System;
using System.Threading;
using static System.Net.Mime.MediaTypeNames;namespace csharp线程学习
{internal class Program{static void Main(string[] args){线程的创建//Console.WriteLine(\n线程的创建);//CreatMyThread_1();//无参数//CreatMyThread_2();//有参数//CreatMyThread_3();//有参数//CreatMyThread_4();//使用lamada表达式两个线程共享全局变量Console.WriteLine(\n线程中全局变量是共享的);//Thread thread1 new Thread(Func1);//thread1.Start();//Thread thread2 new Thread(Func2);//thread2.Start();//使用线程锁来解决变量共享的问题Console.WriteLine(\n线程中使用lock线程锁);//Thread thread1 new Thread(ThreadLine1);//thread1.Start();//Thread thread2 new Thread(ThreadLine2);//thread2.Start();//使用线程锁Console.WriteLine(\n线程中使用Monitor线程锁);Thread thread1 new Thread(ThreadLine4);thread1.Start();Thread thread2 new Thread(ThreadLine5);thread2.Start();Console.ReadLine();Console.ReadLine();}/// summary/// 创建线程的方式_1/// /summaryprivate static void CreatMyThread_1(){//创建线程的方式Thread thread new Thread(ThreadProc);thread.Start();}/// summary/// 创建线程的方式有参数_2s/// /summaryprivate static void CreatMyThread_2(){Thread m_thrad new Thread(new ParameterizedThreadStart(ThreadProcWithPro));//创建一个有参数的线程m_thrad new Thread(ThreadProcWithPro);m_thrad.Start(今天是2023年);}/// summary/// 创建线程的方式有参数_3/// /summaryprivate static void CreatMyThread_3(){Thread m_thrad new Thread(ThreadProcWithPro);//创建一个有参数的线程m_thrad.Start(今天是2023年);}/// summary/// 创建线程的方式有参数_4/// /summaryprivate static void CreatMyThread_4(){Thread t new Thread(() Console.WriteLine(Hello!));}private static void ThreadStop(){Thread m_thrad new Thread(new ParameterizedThreadStart(ThreadProcWithPro));//创建一个有参数的线程m_thrad new Thread(ThreadProcWithPro);m_thrad.Start(今天是2023年);m_thrad.Join();//通过添加异常停止}/// summary/// 一个可以被执行的方法没有参数/// /summaryprivate static void ThreadProc(){for (int i 0; i 5; i){Console.WriteLine(你好我的朋友);Thread.Sleep(0);}}/// summary/// 一个可以被执行的方法有参数/// /summary/// param namestrparobject类型的参数/paramprivate static void ThreadProcWithPro(object strpar){Console.WriteLine(传递的参数是: (string)strpar);}//用于演示两个线程之间全局变量是共享的public static int number 0;private static void Func1(){for (; number 10; number){if (number 4){Thread.Sleep(10);}Console.WriteLine($当前是线程1 number{number});}}private static void Func2(){for (; number 10; number){if (number 5){Thread.Sleep(10);}Console.WriteLine($当前是线程2 number{number});}}//线程的锁两个线程中如果有lock必须要等到当前线程执行完毕之后才能进行下一个private static object locktokenA new object();//锁必须是引用类型private static void ThreadLine1(){lock (locktokenA){for (; number 10; number){if (number 5){Thread.Sleep(10);}Console.WriteLine($当前是线程1 number{number});}}}private static void ThreadLine2(){lock (locktokenA){for (; number 15; number){if (number 7){Thread.Sleep(10);}Console.WriteLine($当前是线程2 number{number});}}}//使用Monitor锁来控制多线程private static void ThreadLine4(){Monitor.Enter(locktokenA);for (; number 10; number){if (number 5){Thread.Sleep(10);}Console.WriteLine($当前是线程1 number{number});}Monitor.Exit(locktokenA);}private static void ThreadLine5(){Monitor.Enter(locktokenA);for (; number 15; number){if (number 7){Thread.Sleep(10);}Console.WriteLine($当前是线程2 number{number});}Monitor.Exit(locktokenA);}}
}