有没有建网站的app,建设局电工证与安监局电工证,网站建设的重要性意义,从化区建设局网站文章目录 C# 多线程进程与线程无参数的子线程带参数的子线程运行结果 销毁线程 Abort()运行结果 ThreadPool和Task运行结果 异步与同步运行结果 lock单线程运行结果 多线程运行结果 使用lock运行结果 C# 多线程
进程与线程
进程#xff1a;进程就是一个应用程序#xff0c;… 文章目录 C# 多线程进程与线程无参数的子线程带参数的子线程运行结果 销毁线程 Abort()运行结果 ThreadPool和Task运行结果 异步与同步运行结果 lock单线程运行结果 多线程运行结果 使用lock运行结果 C# 多线程
进程与线程
进程进程就是一个应用程序对电脑的各种资源的占用
线程线程是程序执行的最小单位任何操作都是线程完成的线程依托进程存在的一个进程可以有多个线程
无参数的子线程 public static void ChildThread1(){Console.WriteLine(Child thread1 is starts);}带参数的子线程
ChildThread2是带参数的子线程所以要使用ParameterizedThreadStart类型的委托来指定子线程 如果使用的是不带参数的委托不能使用带参数的Start方法运行线程否则系统会抛出异常。 但使用带参数的委托可以使用thread.Start()来运行线程这时所传递的参数值为null。 特别注意ParameterizedThreadStart委托的参数类型必须是object的 using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp2
{class Test{public static void ChildThread1(){Console.WriteLine(Child thread1 is starts);}//注意ParameterizedThreadStart委托的参数类型必须是object的public static void ChildThread2(object obj){Console.WriteLine(Child thread2 is starts,the parameter is {0}, obj);}public static void Main(){ThreadStart thread1 new ThreadStart(ChildThread1); //通过ThreadStart委托指定子线程的方法ParameterizedThreadStart thread2 new ParameterizedThreadStart(ChildThread2); //有参的委托Console.WriteLine(MainThreadCreating the child thread1);Console.WriteLine(MainThreadCreating the child thread2);Thread childThread1 new Thread(thread1); //创建子线程1Thread childThread2 new Thread(thread2);//创建子线程2childThread1.Start(); //运行子线程1childThread2.Start(子线程2的参数);//运行子线程2传递参数//如果使用的是不带参数的委托不能使用带参数的Start方法运行线程否则系统会抛出异常。//但使用带参数的委托可以使用thread.Start()来运行线程这时所传递的参数值为null。Console.ReadKey();}}
}
运行结果 销毁线程 Abort()
使用Abort()中止子线程. 通过抛出 threadabortexception 在运行时中止线程。这个异常不能被捕获如果有 finally 块控制会被送至 finally 块。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp2
{class Test{public static void ChildThread1(){Console.WriteLine(Child thread1 is starts);}//注意ParameterizedThreadStart委托的参数类型必须是object的public static void ChildThread2(object obj){Console.WriteLine(Child thread2 is starts,the parameter is {0}, obj);}public static void ChildThread3(){try{Console.WriteLine(Child thread3 starts);for (int i 0; i 5; i){Thread.Sleep(100);Console.WriteLine(i);}Console.WriteLine(Child Thread3 Completed);}catch (ThreadAbortException e){Console.WriteLine(Thread Abort Exception);}finally{Console.WriteLine(Couldnt catch the thread Exception);}}public static void Main(){ThreadStart thread3 new ThreadStart(ChildThread3);Console.WriteLine(MainThreadCreating the child thread3);Thread thread new Thread(thread3);thread.Start();//停止主线程1000Thread.Sleep(2000);Console.WriteLine(In Main: Aborting the Child thread);thread.Abort();Console.ReadKey();}}
}运行结果 ThreadPool和Task
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp2
{class Test{public static Thread t null;public static void ChildThread1(){int i 5;while (i 0){Console.WriteLine(string.Format(线程【1】的i:{0} , i));Thread.Sleep(10);i--;}Console.WriteLine(线程【1】结束);//Console.WriteLine(Child thread1 is starts);}//注意ParameterizedThreadStart委托的参数类型必须是object的public static void ChildThread2(object obj){int i 5;while (i 0){Console.WriteLine(string.Format(线程【2】的i:{0} , i));Thread.Sleep(10);i--;}Console.WriteLine(线程【2】结束);}public static void ChildThread3(){int i 5;while (i 0){Console.WriteLine(string.Format(线程【3】的i:{0} , i));Thread.Sleep(10);i--;}Console.WriteLine(线程【3】结束);}public static void Main(string[] args){t new Thread(new ThreadStart(ChildThread1));t.Start();//用线程池ThreadPool.QueueUserWorkItem(ChildThread2, new object());//用Task方法创建System.Threading.Tasks.Task.Factory.StartNew(ChildThread3);Console.ReadLine();}}
}
运行结果 线程都是独立的不会互相影响。
异步与同步
C# 5.0引入了异步方法Async Methods的概念使得编写异步代码变得更加容易。异步方法使用async关键字标记返回类型必须是Task或Task方法中使用await关键字来等待异步操作完成。通过使用异步方法可以在不阻塞主线程的情况下执行耗时操作从而提高程序的并发性和响应性。示例如下
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp2
{class Test{public static async Task Main(string[] args){await DownloadWebsiteAsync();Console.ReadKey();}static async Task DownloadWebsiteAsync(){using (HttpClient client new HttpClient()){string website https://www.example.com;string content await client.GetStringAsync(website);Console.WriteLine(等待异步执行完成);}}}
}运行结果 lock
如果你想控制多线程的线程的执行顺序就需要用到lock
参考链接https://blog.csdn.net/u012563853/article/details/124767902
单线程
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp2
{class Test{static int a 0;static int b 0;private static object o new object();static void Main(string[] args){methodA();methodB();Console.ReadKey();}private static void methodA(){Console.WriteLine(我是A方法);}private static void methodB(){Console.WriteLine(我是B方法);}private static void methodC(){Console.WriteLine(我是C方法是随机出现的);}}
}这样是按顺序执行的因为是单线程的先执行methodA再去执行methodB
运行结果 多线程
我们增加了多线程就是让A和B方法同时执行此时结果就是不可控制的。有时候先执行B方法有时候先执行A方法。先执行B方法。 using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp2
{class Test{static int a 0;static int b 0;private static object o new object();static void Main(string[] args){//methodA();//methodB();Thread t1 new Thread(methodA);Thread t2 new Thread(methodB);t1.Start();t2.Start();Console.ReadKey();}private static void methodA(){a 1;Console.WriteLine(我是A方法a a);Thread.Sleep(2000); //暂停5秒b 2;Console.WriteLine(我是A方法b b);}private static void methodB(){a;Console.WriteLine(我是B方法a a);Thread.Sleep(1000); //暂停1秒b;Console.WriteLine(我是B方法b b);}private static void methodC(){Console.WriteLine(我是C方法是随机出现的);}}
}运行结果 所以我们可以使用lock去锁住代码段锁住的这段代码此时只能有一个线程去访问只有等这个线程访问结束了其他线程才能访问。
使用lock
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleApp2
{class Test{static int a 0;static int b 0;private static object o new object();static void Main(string[] args){//methodA();//methodB();Thread t1 new Thread(methodA);Thread t2 new Thread(methodB);t1.Start();t2.Start();Console.ReadKey();}private static void methodA(){lock (o){a 1;Console.WriteLine(我是A方法a a);Thread.Sleep(2000); //暂停5秒b 2;Console.WriteLine(我是A方法b b);}}private static void methodB(){lock (o){a;Console.WriteLine(我是B方法a a);Thread.Sleep(1000); //暂停1秒b;Console.WriteLine(我是B方法b b);}}private static void methodC(){Console.WriteLine(我是C方法是随机出现的);}}
}运行结果 这样也是等效的 Enter相当于进入这个代码块Exit是退出这个代码块。当这个代码块再运行的时候其他线程就不能访问。Monitor中的{}可以去掉不影响。