C#线程使用实例分析

发布时间:2022-08-13 14:21:27 作者:iii
来源:亿速云 阅读:126

本文小编为大家详细介绍“C#线程使用实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#线程使用实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1.首先看看我们的问题

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代表线程挂起,相当于停止等待了。我们使用这个可以实现循环函数等待答复。 

C#线程使用实例分析

单线程只需要建立一个线程就可以啦, 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,线程二才退出,

C#线程使用实例分析

C#线程使用实例分析

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#线程使用实例分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. C#类使用实例分析
  2. C#如何使用异步委托开启线程

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:如何使用Python处理EXCEL表格

下一篇:vuepress如何实现自定义首页的样式风格

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》