C#多线程Thread使用示例详解

 更新时间:2021年07月11日 17:27:34   作者:空山新雨  
这篇文章主要为大家详细介绍了C#多线程Thread使用示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C#多线程Thread使用的示例代码,供大家参考,具体内容如下

多线程:

线程生命周期状态图:

C#线程优先级(概率高低):

基本使用示例:

using System;
using System.Threading;
 
namespace month_9_10._1009
{
    class Run5
    {
        /* 测试线程的调用过程
         * 主线程输出world,子线程输出hello
         */
        public static void showHello()
        {
            for(int i = 0; i < 100; i++)
            {
                Console.WriteLine($"Hello\t#{Thread.CurrentThread.Name}");
            }
        }
        public static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "Main Thread!";
            var childThreadRef = new ThreadStart(showHello);
            Console.WriteLine("This is Main process!!!");
            var childThread = new Thread(childThreadRef);
            childThread.Name = "Child Thread!";
            childThread.Start();
            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine($"World!\t#{Thread.CurrentThread.Name}");
            }
        }
    }
}

实例1:窗体标签循环滚动

using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
 
namespace RollMove
{
    public partial class Form1 : Form
    {
        Thread th1 = null;
        public Form1()
        {
            InitializeComponent();
            
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            int _sx = 40;
            int _ex = 280;
            int _top = 70;
            th1 = new Thread(() => {
                while (true)
                {
                    if (_sx <= _ex)
                    {
                        _ex = 280;
                        label1.Location = new Point(_sx, _top);
                        Thread.Sleep(20);
                        _sx += 5;
                    }
                    else
                    {
                        _ex = 40;
                        label1.Location = new Point(_sx, _top);
                        Thread.Sleep(20);
                        _sx -= 5;
                    }
                }
            });
            th1.Start();
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (th1!=null)
            {
                th1.Abort();
            }
        }
    }
}

实例2:进度条

using System;
using System.Threading;
using System.Windows.Forms;
 
namespace month_9_10._1012
{
    public partial class Form_3 : Form
    {
        public static Print.Print print = Console.WriteLine;
        Thread th1, th2;
        public Form_3()
        {
            InitializeComponent();
            Text = "Welcome!";
            CheckForIllegalCrossThreadCalls = false;
            th1 = new Thread(new ThreadStart(Pro1));
            th1.Priority = ThreadPriority.Lowest;
            th1.Start();
            th2 = new Thread(new ThreadStart(Pro2));
            th2.Priority = ThreadPriority.Highest;
            //th2.Start();
            print(th1.Priority);
            print(th2.Priority);
            
        }
 
        void Pro1()
        {
            print("XXXXXXX");
            for (int i = 0; i <= 100; i++)
            {
                
                progressBar1.Value = i;
                label1.Text = $"{progressBar1.Value}%";
                Thread.Sleep(200);
                if (i == 20)
                {
                    th2.Start();
                    th2.Join();
                }
            }
        }
        void Pro2()
        {
            print("YYYYYYYY");
            for (int i = 0; i <= 100; i++)
            {
                progressBar2.Value = i;
                label2.Text = $"{progressBar2.Value}%";
                Thread.Sleep(100);
            }
        }
 
        private void progressBar1_Click(object sender, EventArgs e)
        {
            print("This is Main threading!");
        }
 
        private void Form_3_Load(object sender, EventArgs e)
        {
 
        }
 
        private void Form_3_FormClosing_1(object sender, FormClosingEventArgs e)
        {
            if (th1.ThreadState == ThreadState.Running)
                th1.Abort();
            if (th2.ThreadState == ThreadState.Running)
                th2.Abort();
        }
    }
}

实例三:线程同步(售票模拟)

using System;
using System.Threading;
 
namespace month_9_10._1012
{
    class Run2
    {
        static Print.Print print = Console.WriteLine;
        int _num = 10;
        void Ticket()
        {
            while (true)
            {
                //上锁
                //lock (this)
                //{
                //    if (_num > 0)
                //    {
                //        Thread.Sleep(100);
                //        print(Thread.CurrentThread.Name + "--票数:" + _num--);
                //    }
                //}
 
                //放置监视器
                Monitor.Enter(this);
                if (_num > 0)
                {
                    Thread.Sleep(100);
                    print(Thread.CurrentThread.Name + "--票数:" + _num--);
                }
                Monitor.Exit(this);
            }
        }
        static void Main()
        {
            var a1 = new Run2();
            Thread t1 = new Thread(new ThreadStart(a1.Ticket));
            t1.Name = "线程一";
            Thread t2 = new Thread(new ThreadStart(a1.Ticket));
            t2.Name = "线程二";
            Thread t3 = new Thread(new ThreadStart(a1.Ticket));
            t3.Name = "线程三";
            Thread t4 = new Thread(new ThreadStart(a1.Ticket));
            t4.Name = "线程四";
            t1.Start();
            t2.Start();
            t3.Start();
            t4.Start();
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。 

相关文章

  • C#使用webbrowser的常见用法实例

    C#使用webbrowser的常见用法实例

    这篇文章主要介绍了C#使用webbrowser的常见用法,涉及C#使用webbrowser实现判断网络连接、模拟登陆、点击等常用技巧,需要的朋友可以参考下
    2015-08-08
  • C# 通过Socket读取大量数据的示例

    C# 通过Socket读取大量数据的示例

    这篇文章主要介绍了C# 通过Socket读取大量数据的示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • C#解决引用类型的深度克隆问题

    C#解决引用类型的深度克隆问题

    本文将给大家介绍如何让引用类型的对象复制以后各自拥有独立的内存从而实现一个对象值的变化不会影响别的对象,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-08-08
  • C# 减少嵌套循环的两种方法

    C# 减少嵌套循环的两种方法

    最近在解决性能优化的问题,看到了一堆嵌套循环,四五层级的循环真的有点过分了,在数据量成万,十万级别的时候,真的非常影响性能。本文介绍了C# 减少嵌套循环的两种方法,帮助各位选择适合自己的优化方案,优化程序性能
    2021-06-06
  • C#使用浏览按钮获得文件路径和文件夹路径的方法

    C#使用浏览按钮获得文件路径和文件夹路径的方法

    这篇文章主要介绍了C#使用浏览按钮获得文件路径和文件夹路径的方法,结合实例形式分析了C#浏览器事件响应及文件操作相关技巧,需要的朋友可以参考下
    2017-05-05
  • c#装箱和拆箱知识整理

    c#装箱和拆箱知识整理

    这篇文章主要介绍了c#装箱和拆箱知识,装箱和拆箱是一个抽象的概念,需要的朋友可以参考下
    2014-03-03
  • C#过滤sql特殊字符串的方法

    C#过滤sql特殊字符串的方法

    这篇文章介绍了C#过滤sql特殊字符串的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C#实现控制线程池最大数并发线程

    C#实现控制线程池最大数并发线程

    这篇文章主要介绍了C#实现控制线程池最大数并发线程的相关资料,需要的朋友可以参考下
    2016-07-07
  • C# windows语音识别与朗读实例

    C# windows语音识别与朗读实例

    这篇文章主要为大家详细介绍了C# windows语音识别与朗读实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C#编程调用Cards.dll实现图形化发牌功能示例

    C#编程调用Cards.dll实现图形化发牌功能示例

    这篇文章主要介绍了C#编程调用Cards.dll实现图形化发牌功能,结合实例形式分析了C#动态链接库调用及图形操作技巧,需要的朋友可以参考下
    2017-06-06

最新评论