C# 线程
Posted 安以痕_陈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 线程相关的知识,希望对你有一定的参考价值。
进程:就好比你运行一个程序,打开一个记事本等。一个进程至少有一个线程,同一个进程中可以有多个线程“并发”执行。其实多线程并发执行,就是多个线程之间不停地切换,只不过切换的速率过快。
线程肯定要执行一段代码。所以要产生一个线程,必须先为这个线程写一个方法,这个方法的中的代码就是为线程运行所要执行的代码。线程启动时,需要委托来调用这个方法。所调用的方法都是没有返回值的。
为什么要使用线程?
1,让计算机能“同时间”做更多的事情,提高效率。、
2,后台运行程序时,提高程序的运行效率,也不会使界面出现无响应状态
3,减少计算机cpu所处的空闲状态
产生线程的步骤:
1,编写产生线程所要执行的方法;
2,引用System.Threading命名空间
3,实例化Thread类,并传入一个指向线程所要运行方法的委托、
4,调用线程的start方法,开启线程
单线程与多线程
private void button1_Click(object sender, EventArgs e)
{
for (long i = 0; i < 999999999999; i++)
{ }
MessageBox.Show("Hello,Over");
}
若只有这个UI单线程,那么当点击界面的Button按钮时,在执行代码期间,我们将拖不动UI界面。我们只有在另外建一个线程,用那个线程调用这个循环才能解决问题。
前台线程和后台线程区别:
public void demo()
{
for (long i = 0; i < 999999999999; i++)
{ }
MessageBox.Show("Hello,Over");
}
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(demo);
th.Start();
}
这是一个新建的线程,当正在执行代码时,我们关闭窗体,但程序还未结束,等程序运行完这个循环后,将会弹出信息框。
一般线程都默认为前台线程,只有设置 th.IsBackground = true;将它设置为后台线程。
前台线程:只有所有前台线程都关闭了,才能使程序结束
后台线程;只有所有前台线程都结束了,后台线程会自动结束
线程重入问题
微软有一个检查线程重入问题,也就是我新建的一个线程不能访问界面UI线程的文本框内容。
public void demo()
{
for (long i = 0; i < 9999; i++)
{
int a = int.Parse(textBox1.Text);
a++;
textBox1.Text = a.ToString();
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(demo);
th.Start();
}
线程间操作无效: 从不是创建控件“textBox1”的线程访问它。
也就是,我自定义的线程th无法操作UI线程的控件。若解决这个问题需要, TextBox.CheckForIllegalCrossThreadCalls = false;关闭它的重入检查。
若两个线程都执行循环,但执行的结果并不是两者之间的累加,如例题;
public void demo()
{
for (long i = 0; i < 1000; i++)
{
int a = int.Parse(textBox1.Text);
a++;
textBox1.Text = a.ToString();
Console.WriteLine(Thread.CurrentThread.Name + a);
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(demo);
th.Name = "线程1";
th.Start();
Thread th1 = new Thread(demo);
th1.Name = "线程2";
th1.Start();
}
执行的结果并不是2000,而是1078,这并不代表着执行的次数,如图线程1和线程2总是互相切换执行,他们各自的线程次数是满足1000次的。解决这个问题可以使用lock关键字实现加锁。 lock(this){for(....)....}
线程间传参数
它可以传一个参数也可以传多个参数,多个参数为一个集合。但传得参数类型为object
public void demo(object name)
{
MessageBox.Show("hello "+name.ToString());
}
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(demo);
th.Start("chen");
}
多个参数:
public void demo(object li)
{
List <string>list= li as List<string>;
if (list !=null)
{
foreach (var s in list)
{
MessageBox.Show(s);
}
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(demo);
th.Start(new List<string>() {"chen","li "});
}
终止线程:
1,Abort()方法,终止已开启的线程,常用于终止永久停止的线程,一旦被终止,将无法重新启动。调用该方法时会抛出ThreadAbortException异常。
2,Join()方法,用来阻止调用该线程,直到某一个线程终止为止。
线程优先级,也就是在多个线程并发是,控制谁先谁后。
以上是关于C# 线程的主要内容,如果未能解决你的问题,请参考以下文章