C#|C# 线程锁和单多线程简单使用
前言:
博主昨天在用C#写毕设的时候遇到了一个问题,就是博主的发送命令,需要循环发送,但是要我的接收是有1秒延时,于是就出现了,我循环发送命令,最后只收到了,最后两条命令的值,于是在一些大佬群里问有没有人会C#的线程锁,得到的答复是这门语言用的人很少,于是博主翻阅资料自学了一下,学了之后就想写出来和大家一起分享一下,除了线程锁,顺带提一下多线程,写的不好,不喜勿喷。
每日一遍,心情愉悦
文章图片
1.首先看看我们的问题
文章图片
【C#|C# 线程锁和单多线程简单使用】我们可以看到我们的循环得到的值会非常快速的得到答案,但是我在做项目的时候需要这个循环函数等待我的接收答复,于是我们要用到线程锁这方面的知识。
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)
可以根据自己的实例来定义线程数量,理论上是线程越多,越快,但是也要考虑线程浪费。
//单线程
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,线程二才退出,
文章图片
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,看是否是一个线程
}
}
}
使用双线程可以提高我们输出的速度,多线程的使用可以大大加快我们的速率。
自我总结: 这个问题是我写毕设遇到的一个难题,开始不知道需要使用线程,然后通过查阅资料,使用了线程锁,其实我用的并不怎么熟但是只要自己愿意学习,是可以学会的,人嘛,总是要不断的进步,才能不迷茫,有些事情需要靠自己。好了,今天的分享就到这里。哈哈哈
文章图片
推荐阅读
- 急于表达——往往欲速则不达
- 第三节|第三节 快乐和幸福(12)
- 20170612时间和注意力开销记录
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- 对称加密和非对称加密的区别
- 眼光要放高远
- 樱花雨
- 前任
- 2020-04-07vue中Axios的封装和API接口的管理
- 烦恼和幸福