C# 线程简单介绍及使用详情
脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用
前言
用C#写毕设的时候遇到了一个问题,就是博主的发送命令,需要循环发送,但是要我的接收是有1秒延时,于是就出现了,我循环发送命令,最后只收到了,最后两条命令的值,于是在一些大佬群里问有没有人会C#的线程锁,得到的答复是这门语言用的人很少,于是博主翻阅资料自学了一下,学了之后就想写出来和大家一起分享一下,除了线程锁,顺带提一下多线程,写的不好,不喜勿喷。
1.首先看看我们的问题
我们可以看到我们的循环得到的值会非常快速的得到答案,但是我在做项目的时候需要这个循环函数等待我的接收答复,于是我们要用到线程锁这方面的知识。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | private static object lockObj = new object(); //定义线程锁 private int num = 0 ; private void Test() { while ( true ) { lock (lockObj) //锁住这个代码块 { num++; string name = Thread.CurrentThread.Name; //获取线程名 textBox1.AppendText(name+ "测试:" +num); //这个是TextBox1的追加 textBox1.AppendText(System.Environment.NewLine); Thread.Sleep( 2000 ); //将线程挂起,相当于停止2秒 if (num>= 10 ) //让这个线程执行10次就退出 { break ; } } } } |
这个是使用单线程完成的效果,private void Test(),我们在定义线程的时候就会在线程Thread(Test)里面定义为Test函数名,代表着,线程跑这个函数,while (true)表示这个线程一直在这里跑直到退锁,lock (lockObj)代表上锁,把这个代码块锁住直到解锁,相当于一直在这运行,只要我们不退锁,博主只是使用break退出,Sleep代表线程挂起,相当于停止等待了。我们使用这个可以实现循环函数等待答复。
单线程只需要建立一个线程就可以啦, while (true) 可以根据自己的实例来定义线程数量,理论上是线程越多,越快,但是也要考虑线程浪费。
1 2 3 4 5 6 7 | //单线程 Thread thred1 = new Thread(Test); //定义一个线程 thred1.Name = "thred1" ; //线程名 thred1.IsBackground = true ; //设置为后台线程就是True thred1.Start(); //开始执行这个线程 int n = thred1.ManagedThreadId; //这个线程ID的标识 Console.WriteLine(n); |
博主再使用多线程操作一下,博主建立了两个线程跑的这个程序,通过看那个name可以看出来,一个Thread1一个Thred2,我们会发现博主的退出的条件是,大于或等于10就退出,理论上应该在10就停止,但是我们使用了两个线程,在第二个线程到达的时候我们的num已经为10了,线程一已经退出了,所以到了11,线程二才退出,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Forms; namespace IC00 { public partial class Form1 : Form { public Form1() { System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false ; //抛 textBox1.AppendText的异常 InitializeComponent(); } private static object lockObj = new object(); //定义线程锁 private int num = 0 ; private void Test() { while ( true ) { lock (lockObj) { num++; string name = Thread.CurrentThread.Name; //获取线程名 textBox1.AppendText(name+ "测试:" +num); //这个是TextBox1的追加 textBox1.AppendText(System.Environment.NewLine); Thread.Sleep( 2000 ); //将线程挂起,相当于停止2秒 if (num>= 10 ) //让这个线程执行10次就退出 { break ; } } } } private void button1_Click(object sender, EventArgs e) { //单线程 Thread thred1 = new Thread(Test); //定义一个线程,运行Test thred1.Name = "thred1" ; //线程名 thred1.IsBackground = true ; //设置为后台线程就是True thred1.Start(); //开始执行这个线程 int n = thred1.ManagedThreadId; //这个线程ID的标识 Console.WriteLine(n); //在控制器打印线程ID //多个线程 Thread thred2 = new Thread(Test); thred2.Name = "thred2" ; thred2.IsBackground = true ; thred2.Start(); int m = thred2.ManagedThreadId; Console.WriteLine(m); //在控制器打印线程ID,看是否是一个线程 } } } |
使用双线程可以提高我们输出的速度,多线程的使用可以大大加快我们的速率。
到此这篇关于C# 线程简单介绍及使用详情的文章就介绍到这了,更多相关C# 线程使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
最新评论