C# 线程的基本使用

news2024/12/24 2:40:19

一 多线程的概念

1 进程Process

2 线程Thread

① 线程中的指令:一个方法(委托)
② 线程中的数据:相关的对象;

3 System.Threading.Thread属性

在这里插入图片描述

4 System.Threading.Thread方法

在这里插入图片描述

5 线程的创建

1) Thread类有一个构造方法,格式如下:

public Thread(ThreadStart fun);

2) 其中ThreadStart是一个委托

public delegate void ThreadStart();

3) 下面是创建一个Thread对象并启动这个线程的一般方法:

① Thread thread=
new Thread(new ThreadStart(obj.fun));
② thread.Start();
③ 有时,使用匿名函数及Lambda表达式更方便;

6 线程的启动和停止

1) 启动:调用线程对象的Start()

2) 停止

线程函数会一直执行下去,直至它结束

3) 另外

Abort()终止;
Suspend()挂起 Resume()恢复
Sleep(毫秒数)

4) 线程的状态 ThreadState

在这里插入图片描述

5)线程的优先级ThreadPriority

在这里插入图片描述

二 线程的同步

1 使用Join()方法

将单独的执行线程合并成一个线程;

2 Lock语句与Monitor类

Lock(对象或表达式)
{
…语句;
}

System.Threading.Monitor.Enter(对象或表达式);
try
{

}
finally
{
System.Threadiing.Monitor.Exit(对象或表达式);
}

3 用于同步控制的类

在这里插入图片描述

4 线程池及其相关类

Threadpool.QueueUserWorkItem()等方法来提交相应的任务;
QueueUserWorkItem(WaitCallback,object)
QueueUserWorkItem(WaitCallback)
其中public delegate void WaitCallback(objec state);

5 System.Threading.TImer类

Timer的构造方法如下:
public Timer(TimerCallback callback,//执行的任务
object state,//数据
int dueTime, //启动前的延时
int period //任务之间的间隔
);
其中TimerCallback是:
public delegate void TimerCallback(object state);

6 System.Windows.Forms.Timer类

直接从工具箱托过来
属性 Interval,Enabled
事件 Tick

三 集合的线程安全性

① IsSynchoronized 属性用于判断是否为同步版本,SyncRoot属性提供了集合自己的同步版本;
② Array,ArrayList,SortedList,Hashtable等,都可以使用Synchronized()方法获取一个线程安全的包装对象;

四 Windows界面与线程

1 界面的主线程

2 对界面的更新智能使用主线程

3 其他线程则可以这样

if(this.InvokeRequired)
{
this.BeginInvoke(new AddMsg(this.AddMsgFun),new object[]{msg});//显示到界面
}
else
{
this.AddMsgFun(msg);
}

五 使用BackgroundWorker组件

① DoWork事件;
② RunWokerAsync方法;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 线程的Join
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Runner r = new Runner();
            Thread thread = new Thread(r.run);
            thread.Start();

            thread.Join();

            for(int i=0;i<10;i++)
            {
                Console.WriteLine("t" + i);
                Thread.Sleep(100);
            }
        }
    }

    class Runner
    {
        public void run()
        {
            for(int i=0;i<10;i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(100);
            }
        }
    }
}

using System;
using System.Collections;
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.Forms;

namespace 多线程绘图
{
    public partial class Form1 : Form
    {
        private ArrayList threads = new ArrayList();

        public Form1()
        {
            InitializeComponent();
        }

        void AddMovingObject()
        {
            MovingShape obj = new MovingShape(this.pictureBox1);
            Thread thread = new Thread(new ThreadStart(obj.run));
            thread.IsBackground = true;
            thread.Start();
            threads.Add(thread);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            AddMovingObject();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            AddMovingObject();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            foreach(Thread thread in threads)
            {
                thread.Suspend();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            foreach(Thread thread in threads)
            {
                thread.Resume();
            }
        }
    }

    public class MovingShape
    {
        bool bContinue = false;
        private int size = 60;
        private int speed = 10;
        private Color color;
        private Brush brush;
        private Pen pen;
        private int type;
        private int x, y, w, h, dx, dy;
        protected Control app;
        Random rnd = new Random();

        public MovingShape(Control app)
        {
            this.app = app;
            x = rnd.Next(app.Width);
            y = rnd.Next(app.Height);
            w = rnd.Next(size);
            h = rnd.Next(size);
            dx = rnd.Next(speed);
            dy = rnd.Next(speed);
            color = Color.FromArgb(
                rnd.Next(128, 255),
                rnd.Next(128, 255),
                rnd.Next(128, 255));
            pen = Pens.Black;
            brush = new SolidBrush(color);
            type = rnd.Next(3);
            bContinue = true;
        }

        public void run()
        {
            while(true)
            {
                x += dx;
                y += dy;
                if (x < 0 || x + w > app.Width)
                    dx = -dx;
                if (y < 0 || y + h > app.Height)
                    dy = -dy;
                Graphics g = app.CreateGraphics();

                switch(type)
                {
                    case 0:
                        g.FillRectangle(brush, x, y, w, h);
                        g.DrawRectangle(pen, x, y, w, h);
                        break;
                    case 1:
                        g.FillEllipse(brush, x, y, w, h);
                        g.DrawEllipse(pen, x, y, w, h);
                        break;
                    case 2:
                        g.FillPie(brush, x, y, w, h, 0.1F, 0.9F);
                        g.DrawArc(pen, x, y, w, h, 0.1F, 0.9F);
                        break;
                }
                Thread.Sleep(130);
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/124312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识Spring

目录 一&#xff1a; 为什么要学习&#xff1f; 二&#xff1a; 概述 三&#xff1a;Spring发展史 一&#xff1a; 为什么要学习&#xff1f; 可以最大程度地简化项目的开发大量公司在使用顶级的源码设计:spring框架源码设计非常优秀&#xff0c;在java开源项目中可以说是顶…

1.8T数据离奇消失之谜

编者按 数字化浪潮蓬勃兴起&#xff0c;企业面临的安全挑战亦日益严峻。 腾讯安全近期将复盘2022年典型的攻击事件&#xff0c;帮助企业深入了解攻击手法和应对措施&#xff0c;完善自身安全防御体系。 本篇是第六期&#xff0c;讲述了某企业NAS系统数据被删除&#xff0c;始…

SpringBoot 配合126邮箱实现邮件发送功能

126邮箱邮件发送授权码申请pom依赖邮件配置代码编写Bean与配置自动装载原始手工方式发送邮件发送纯文本的邮件发送包含HTML标签的邮件发送包含附件的邮件发送包含静态资源的文件测试SpringBoot 提供了系统级别邮箱服务&#xff0c;只需要导入一个邮箱启动器然后进行配置就可以使…

LabVIEW如何减少下一代测试系统中的硬件过时6

LabVIEW如何减少下一代测试系统中的硬件过时6 HAL Benefits When addressing obsolescence, HALs yield the benefits of lowermigration costs, faster migration time, higher code reuse, and easiermaintainability. Lower Migration Costs The act of designing a use…

如何pdf合并成一个?推荐3种方法

在企业处理多份合同文件或者财务报销时&#xff0c;经常会处理大量的PDF文件。因此为了更高效率办公&#xff0c;我们经常需要将多个pdf合并成一个。如何pdf合并成一个呢&#xff1f;给大家推荐3个方法。 1、Smallpdf工具 如何pdf合并成一个&#xff1f;推荐大家可以使用Small…

一篇canvas带你画出整个特效世界

目录 一&#xff0c;canvas是啥&#xff1f; 1.初识canvas 2.路径绘制 3.拆分画法 4.清除画布 5.绘制圆形笑脸 6.贝塞尔曲线 ①二次贝塞尔曲线 ②三次贝塞尔曲线 一&#xff0c;canvas是啥&#xff1f; Canvas是HTML5中新出的一个元素&#xff0c;我们可以在上面绘制…

为什么redis中提供hash数据类型?

目录 1.什么是哈希表&#xff1f;缺点是什么&#xff1f; 2.Redis的数据类型&#xff08;type、encoding&#xff09; 3.比较常用命令、使用场景、实现方式 1.什么是哈希表&#xff1f;缺点是什么&#xff1f; 把关键字key映射到表中记录的地址。映射关系是散列函数&#x…

图表控件LightningChart.NET 入门教程(六):许可证管理介绍(上)

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…

初学Java web(十)Filter 和 Listener

Filter和Listener 一.Filter 概念&#xff1a;Filter表示过滤器&#xff0c;是JavaWeb三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。 过滤器一般完成一些通用的操作&#xff0c;比如&#xff1a;权限控…

Nuttx学习入门

Nuttx学习 NuttX 是一个实时操作系统 (RTOS)&#xff0c;强调标准合规性和占用空间小。可从 8 位扩展到 64 位微控制器环境&#xff0c;NuttX 中的主要管理标准是 POSIX 和 ANSI 标准。 NuttX 的主要环境依赖性是 (1) GNU make&#xff0c;(2) bash 脚本&#xff0c;和 (3) L…

第三十四章 数论——高斯消元解线性方程组

第三十四章 数论——高斯消元解线性方程组一、高斯消元1、线性方程组2、高斯消元步骤&#xff08;1&#xff09;数学知识铺垫增广矩阵和阶梯矩阵初等变换&#xff08;2&#xff09;高斯消元步骤二、代码模板1、问题&#xff1a;2、代码一、高斯消元 1、线性方程组 我们在小学…

P3884 [JLOI2009]二叉树问题

题目 如下图所示的一棵二叉树的深度、宽度及结点间距离分别为&#xff1a; 深度&#xff1a;44宽度&#xff1a;44结点 8 和 6 之间的距离&#xff1a;88结点 7 和 6 之间的距离&#xff1a;33 其中宽度表示二叉树上同一层最多的结点个数&#xff0c;节点 u, vu,v 之间的距离…

算法工程师需要学习的基础

文章目录应该早点系统地了解算法工程师需要学习的东西的&#xff0c;B站上的up主&#xff1a;梁唐讲的很好&#xff0c;大家可以去看一下&#xff0c;只截了一部分图做一个记录

MySQL5.7 多主一从(多源复制)同步配置

主从复制有如下一些优势&#xff1a; 分担负载&#xff1a;对业务进行读写分离&#xff0c;减轻主库I/O负载&#xff0c;将部分压力分担到从库上&#xff0c;缩短客户查询响应时间。 增加健壮性&#xff1a;在主库出现问题时&#xff0c;可通过多种方案将从库设置为主库&#…

100%全国产龙芯2K1000设计方案

国产工业处理器&#xff0c;龙芯2K1000主板&#xff0c;100%全国产化方案 可实现100%国产元器件方案&#xff0c;国产处理器 信迈2k1000开发板采用龙芯 2k1000处理器&#xff0c;处理器集成 2 个 GS264 处理器核&#xff0c;主频 1GHz&#xff0c;64 位 DDR3 控制器&#xff…

Vue与VueComponent的内置关系

上一节讲到了 Vue.extend 与 VueComponent 的区别&#xff0c;这一节讲一讲 Vue 与 VueComponent的内置关系。 原型与原型链 这里需要用到原型与原型链中的知识点&#xff0c;具体文章链接在这里。js中的原型与原型链 这里只需要理解一个点&#xff0c;那就是构造函数的protot…

【idea2022.3】安装教程2022-12

教程目录教程简介所需环境和版本软件下载执行过程安装激活开始使用前的配置结束语教程简介 换电脑了&#xff0c;又经历了一遍软件和环境的安装&#xff0c;已经安装好了jdk和对应版本的maven&#xff0c;所以接下来该安装idea等软件了 所需环境和版本 系统&#xff1a;win1…

软件测试人员30K的月薪,是个什么段位?

大家可以参照BAT等一线大厂的职级&#xff0c;一般是高级测试工程师和资深测试开发工程师的职位&#xff0c;下面是在字节跳动年薪40W的测试工程师 掌握的技能树主要包含哪个方面&#xff1f; 现在的行情&#xff0c;大家想要拿到30k这个薪资&#xff0c;不妨审视自己&#xf…

跨平台备份工具Duplicati

本文软件得到了网友 冷心 的推荐&#xff1b; 什么是 Duplicati &#xff1f; Duplicati 是一个免费的开源备份客户端&#xff0c;可将加密的、增量的、压缩的备份安全地存储在云存储服务和远程文件服务器上。支持 Amazon S3、IDrive e2、Backblaze (B2)、Box、Dropbox、FTP、G…

【Flask框架】——27 SQLAlchemy高级

1、排序 order_by方法排序&#xff1a;可以指定根据模型中某个属性进行排序&#xff0c;"模型名.属性名.desc()"代表的是降序排序。 # 根据年龄降序 lst session.query(Student).order_by(Student.age.desc()).all() # 根据年龄升序 lst session.query(Student).…