线程
线程用于解决单线程时程序遇到的假死的问题。一般情况下,程序只开了一个主线程,一旦有死循环,或者一直等待,或者处理大数据时,程序都会处于假死状态简单的说就是鼠标各种点击各种移动程序都没有反应。开多线程就可以解决这个问题。
Thread th;
private voidbutton1_Click(object sender, EventArgs e)
{
th= new Thread(test);
th.IsBackground = true;
object a = 100000;
th.Start(a);
}
public void test(object n)
{
int aa = (int)n;
for (int i = 0; i<aa; i++)
{
textBox1.Text = i.ToString();
}
}
private void Form1_FormClosing(objectsender, FormClosingEventArgs e)
{
if(th != null)
{
th.Abort();
}
}
代码一开始 创建了一个 线程对象th,之所以要写在外面,是为了在窗体关闭时判断线程对象是否在运行,是则终止线程,不做这个判断会导致程序爆 “执行CreateHandle()时无法调用值Dispose()”
创建线程对象的时候就要将线程调用的方法作为参数传入
Thread th = new Thread(test);
Test为一个循环赋值的方法。 当调用的方法有参数需要传入时,可以在线程的Start()方法中将参数传入
object a = 100000;
th.Start(a);
需要注意 因为传入线程的参数 必须为Object类型,所以调用函数的形参也必须是object,但是可以在函数体内将形参转换成所需要的类型
int aa = (int)n;
后台线程
th.IsBackground = true;
这里有两个概念
前台线程 后台线程
前台线程 我的理解是跟主线程类似的线程,这种线程需要完全关闭之后程序才会结束
后台线程 有点像低一级的线程,这种线程不需要去刻意关闭他,当前台线程关闭之后,后台线程会自动关闭。
(理解不是很透彻,欢迎指点)
当线程调用的方法需要访问主线程的控件时会爆 线程间操作无效
这个解决方法有两种
第一 用委托 这个后面会讲
第二 很简单
在程序初始化的时候加
Control.CheckForIllegalCrossThreadCalls = false;
取消对跨线程方法的检查
多线程在很多时候对程序有很大的作用,但是开太多的线程也会对CPU造成一定的负荷。所以了解多线程对提高程序的效率有很大的帮助。