提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
1)什么是线程:
在一个进程中,每个独立的功能都需要独立的去运行,这时又需要把当前这个进程划分成多个运行区域,每个独立的小区域(小单元)称为一个线程。
例如:360杀毒软件,同时既可以安全体检电脑又可以清理电脑中的垃圾。那么这里的安全体检是360杀毒软件中的一个线程,清理电脑中的垃圾也是一个线程。
2)什么是多线程:
一个进程如果只有一条执行任务,则称为单线程程序。
一个进程如果有多条执行任务,也就是说在一个进程中,同时开启多个线程,让多个线程同时去完成某些任务(功能)。则称为多线程程序。
一、委托的定义
委托是持有一个或多个方法的对象。但委托与典型的对象不同,委托可以执行,这时委托会执行它所持有的方法。
委托使用的时机:当程序运行时,不能确定具体调用那个方法时。
(在运行时要求,动态选择使用的方法)
二、委托的使用
1、声明一个委托类型。委托声明看上去和方法声明相似,只是没有实现块
2、使用该委托类型声明一个委托变量
3、创建一个委托类型的对象,并把它赋值给委托变量
4、你可以选择为委托对象添加其他方法
5、在代码中你可以像调用方法一样调用委托
6、当委托调用带返回值的委托时:
a、调用列表中最后一个方法返回的就是委托调用返回的值
b、调用列表中所有其他方法的返回值都会被忽略
委托示例:
static void Main(string[] args)
{
MyDelegate md = new MyDelegate(print); //赋值委托1
md();//执行方法
static void print()
{
Console.WriteLine("内部方法");
}
}
三、Lambda表达式:更简单的使用代理
1、编译器类型推断
2、语法格式:(参数列表)=>{方法体:具体要实现线程代理的代码}
一、结果展示
二、多线程理解:
1.碎碎念:
原本没想着用多线程使用,直接调用一个方法就好了,但是,直接调用随机生成方法的话,每单击一次按钮,他只会变动一次,后面才明白要用多线程。而我一开始也只是用的eThread去开启随机生成数字的方法,但是会提示Thread无法控制主页面上的控件,需要和代理一起使用,本来线程就很迷糊了,再加上代理更迷糊了,向别人请教了一下,写出这个才算有点理解线程和代理了。
理解:
a)线程:可以理解为,谁(方法)委托了线程去开启这个线程任务。 侧重于 开线程安排做事
b)代理:可以理解为线程让你去干线程任务中的什么事 ,侧重于 开线程安排 做事
简单的来说就是,线程和需要开启线程的方法一起使用,代理则是和需要启用线程的方法中的实际需要开启线程的代码段使用
c)如果方法中的代码不需要开启线程,该方法直接使用委托的话,则相当于去调用方法。
2.代码示例:
线程的使用
Thread th= new Thread(new ThreadStart(play)); //paly()方法
委托的使用:
//实现委托,action为声明的委托对象,以下代码均是在Play()方法中的方法体
Action act=() =>{
//需要实现委托的代码体
label1.Text = r.Next(0, 9).ToString();
label2.Text = r.Next(0, 9).ToString();
label3.Text = r.Next(0, 9).ToString();
};
label1.Invoke(act);
3.全部代码:
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.Forms;
namespace 摇奖机
{
public partial class GameForm : Form
{
Thread th;
public GameForm()
{
InitializeComponent();
button1.Text = "开 始";
//开启动线程---谁要用这个线程
th= new Thread(new ThreadStart(play));
th.IsBackground = true;
}
bool running = false;
public void button1_Click(object sender, EventArgs e)
{
if (!running)
{
//开始摇色子的时候
button1.Text = "结 束";
//如果线程停止或者挂起,线程恢复
if (th.ThreadState.ToString().Contains(ThreadState.Suspended.ToString()))
{
th.Resume();
}
else
{
//启动,开线程启动
th.Start();
}
running = true;
}
else
{
//摇色子停止
button1.Text = "开 始";
running = false;
th.Suspend();
}
}
public void play()
{
Random r = new Random();
while (running)
{
//实现委托,action为声明的委托对象
Action act=() =>{
label1.Text = r.Next(0, 9).ToString();
label2.Text = r.Next(0, 9).ToString();
label3.Text = r.Next(0, 9).ToString();
};
label1.Invoke(act);
Thread.Sleep(500);
}
}
}
}