所谓多线程,就是让计算机同时处理多个事情,在一个项目里面我们都是需要进行多线程的设计。每一个运行的应用程序是一个进程,而一个进程是由多个线程组成的。
首先在新建的窗体中,我们先拖一个button和一个textbox,并且定义一个方法,实现在textbox1中的数字跳动
private void Test()
{
for (int i = 0; i < 10000; i++)
{
textBox1.Text = i.ToString();
}
}
然后我们点击button后会调用这个方法~
private void Button1_Click(object sender, EventArgs e)
{
Test();
}
这可实现我们在textbox中循环显示一个数字~
然后我们发现在数字跳动的时候是无法移动窗体或者关闭窗体等操作的,我们必须要等循环计数完成后才可以移动或者关闭窗体,出现一个 假卡死的情况~
这时候如果我们需要进行别的操作就必须使用多线程~
首先导入using System.Threading;
private void Button1_Click(object sender, EventArgs e)
{
//创建一个线程去执行这个方法
Thread th = new Thread(Test);
//标记这个线程准备就绪了,可以随时被执行
th.Start();
}
同时在Test方法中,加入:
Control.CheckForIllegalCrossThreadCalls = false;
实现线程的跨线程访问
这是我们发现在计数输出的同时我们可以移动窗体了,意味着我们的计算机可以执行多个任务了~但是当我们需要关闭窗体的时候,如果此时计数还没有结束,一般也是会出现异常的
这是我们需要理解 前台和后台线程的概念与功能
前台线程:只有所有的前台线程都关闭才能完成线程的关闭
后台线程:只要所有的前台线程结束,后台线程会自动结束
通常我们创建的线程都是前台线程,此时我们可以通过
th.IsBackground=true;
使其变为后台线程,再点击Start();
最后,如果线程还没终止,为了防止我们在关闭窗体的时候出现异常,在
属性下的FormCloing页面加入一个条件判断~
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//当你点击关闭窗体的时候,判断线程是否为null
if (th!= null)
{
th.Abort();
}
}
针对当前办法,是无法调用th这个局部变量的,需要我们把局部变量放到全局变量的位置进行判定。
最后放上所有的代码~
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 xiancheng
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Thread th;
private void Button1_Click(object sender, EventArgs e)
{
//创建一个线程去执行这个方法
th = new Thread(Test);
//标记这个线程准备就绪了,可以随时被执行
//th.IsBackground=true;
th.Start();
}
private void Test()
{
for (int i = 0; i < 100000; i++)
{
Control.CheckForIllegalCrossThreadCalls = false;
textBox1.Text = i.ToString();//这样写,会导致新线程去访问主线程的情况,不允许跨线程的访问
//Control.CheckForIllegalCrossThreadCalls = false;
}
}
private void Form1_Load(object sender, EventArgs e)
{
//Control.CheckForIllegalCrossThreadCalls = false;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//当你点击关闭窗体的时候,判断线程是否为null
if (th!= null)
{
th.Abort();
}
}
}
}