乐趣区

关于c#:C-线程锁和单多线程简单使用

前言:

博主昨天在用 C#写毕设的时候遇到了一个问题,就是博主的发送命令,须要循环发送,然而要我的接管是有 1 秒延时,于是就呈现了,我循环发送命令,最初只收到了,最初两条命令的值,于是在一些大佬群里问有没有人会 C# 的线程锁,失去的回答是这门语言用的人很少,于是博主翻阅材料自学了一下,学了之后就想写进去和大家一起分享一下,除了线程锁,顺带提一下多线程,写的不好,不喜勿喷。

每日一遍,情绪愉悦

1. 首先看看咱们的问题

咱们能够看到咱们的循环失去的值会十分疾速的失去答案,然而我在做我的项目的时候须要这个循环函数期待我的接管回答,于是咱们要用到线程锁这方面的常识。

 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,看是否是一个线程
        }
    }
}

应用双线程能够进步咱们输入的速度,多线程的应用能够大大放慢咱们的速率。

自我总结:

这个问题是我写毕设遇到的一个难题,开始不晓得须要应用线程,而后通过查阅材料,应用了线程锁,其实我用的并不怎么熟然而只有本人违心学习,是能够学会的,人嘛,总是要一直的提高,能力不迷茫,有些事件须要靠本人。好了,明天的分享就到这里。哈哈哈

退出移动版