C# 线程简单介绍及使用详情

 更新时间:2022年08月12日 09:17:44   作者:IC00​​​​​​​  
这篇文章主要介绍了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# 线程使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://juejin.cn/post/7130629883184545828

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • unity shader实现较完整光照效果

    unity shader实现较完整光照效果

    这篇文章主要为大家详细介绍了unity shader实现较完整光照效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • C#基于Miniblink控件编写一个简易的浏览器

    C#基于Miniblink控件编写一个简易的浏览器

    miniblink是一款精简小巧的浏览器控件,基于chromium精简而成,是市面上最小巧的chromium内核控件没有之一,本文将结合C#和Miniblink编写一个简易的浏览器,感兴趣的可以了解下
    2024-01-01
  • unity 鼠标悬停事件操作

    unity 鼠标悬停事件操作

    这篇文章主要介绍了unity 鼠标悬停事件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 详解搭建基于C#和Appium的Android自动测试环境

    详解搭建基于C#和Appium的Android自动测试环境

    如果想做手机端的自动化测试,Appium是首选的测试框架,因为网上使用的人多,资料丰富,支持语言多Jave,Python,C#,Ruby,PHP,碰见问题也容易得到帮助。
    2021-05-05
  • 基于反射解决类复制的实现方法

    基于反射解决类复制的实现方法

    本篇文章对反射解决类复制的实现方法进行了详细的分析介绍。需要的朋友参考下
    2013-05-05
  • WPF MVVM制作发送短信小按钮

    WPF MVVM制作发送短信小按钮

    这篇文章主要为大家详细介绍了WPF MVVM发送短信小按钮的制作方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 不用IDE写C#的Hello World的方法

    不用IDE写C#的Hello World的方法

    这篇文章主要介绍了不用IDE写C#的Hello World的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-10-10
  • C# Redis学习系列(一)Redis下载安装使用

    C# Redis学习系列(一)Redis下载安装使用

    这篇文章主要为大家分享了C# Redis学习系列教程第一篇, Redis下载、安装、使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • C#线程池ThreadPool用法简介

    C#线程池ThreadPool用法简介

    这篇文章介绍了C#线程池ThreadPool的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#结合JavaScript实现多文件上传功能

    C#结合JavaScript实现多文件上传功能

    在许多应用场景里,多文件上传是一项比较实用的功能,本文主要为大家详细介绍了C#如何结合JavaScript实现多文件上传功能,感兴趣的小伙伴可以了解下
    2023-12-12

最新评论