C# 高定位高效率程序中 线程与线程池比较

摘要:
后台线程跟前台线程只有一个区别,那就是后台线程不妨碍程序的终止。一旦一个进程所有的前台线程都终止后,CLR将通过调用任意一个存活中的后台进程的Abort()方法来彻底终止进程。

应用程序可以拥有多个线程,当程序需要大量时间来处理部分业务或流程时,就可以通过线程来操作,如果应用程序没有用到线程,那将会出现很麻烦的事情,例如:界面上有个dataGridView需要填充数据,如果有Form_Load事件中实现数据绑定,如果在主线程中操作,那么你运行打开窗体的时候就会出现程序假死的现象.这不是客户所接受的,所以在程序开发中,线程的应用是不可缺少的一部分.

我们用多线程来开发程序,目的就是减少处理器单元的闲置时间,增加处理器单元的操作能力.但这并不能说明在程序中可以泛用多线程,应用不当,会降低系统的性能.例如:如果完成一个作业需要的时间为N,在多线程的情况下,创建线程需要的时间为N0,线程中处理的作业需要的时间为N1,线程销毁需要的时间是N3,还有一些其它的时间这里就不算了,这里可以看出如果作业流程简单的,占用资源和时间不长的则不需要利用一个线程来处理,如果一个作业需要不停的创建线程则需要利用到线程池,从而提高程序的性能.

需要多线程作业,需要添加System.Threading命名空间,下面细说一个Thread的操作:

通过Thread一次使用一个线程,来创建和删除线程.
创建线程:
Thread th = new Thread(new ThreadStart(Method));
开始线程:
th.Start();
销毁线程:
th.Abort();
线程名称:
th.Name="A";
线程休眠:
th.Sleep();
线程挂起:
th.Suspend();
线程恢复:
th.Resume();
说到Thread还有一个方法就是设置后台线程
IsBackground属性设为true,该线程即为后台线程。
后台线程跟前台线程只有一个区别,那就是后台线程不妨碍程序的终止。一旦一个进程所有的前台线程都终止后,
CLR将通过调用任意一个存活中的后台进程的Abort()方法来彻底终止进程。注意:后台线程不能直接操作所在进程
之外的数据引用。

通过ThreadPool来创建线程,如果你的程序需要频繁的创建线程的时候你就可以用到这个类,用实现创建线程,提高程
序的性能.通过ThreadPool.QueueUserWorkItem(new WaitCallback(Method), 1)来创建线程池下面请看一下面的代码:
private void button2_Click(object sender, EventArgs e)
{
int maxTh, minTh, portTh;

ThreadPool.GetMaxThreads(out maxTh, out portTh);
ThreadPool.GetMinThreads(out minTh, out portTh);
richTextBox1.Text = maxTh.ToString() + " , " + minTh.ToString() + " , " + portTh.ToString() + "\n";

ThreadPool.QueueUserWorkItem(new WaitCallback(A1), 1);
ThreadPool.QueueUserWorkItem(new WaitCallback(A2), 1);
}

private void A1(object i)
{
string str = i.ToString();
if (this.InvokeRequired)
{
updateRichTxt ur = new updateRichTxt(UpdateRT);
this.Invoke(ur, str);
}
}
private void A2(object i)
{
string str = ((int)i + 1).ToString();
if (this.InvokeRequired)
{
updateRichTxt ur = new updateRichTxt(UpdateRT);
this.Invoke(ur, str);
}
}

private delegate void updateRichTxt(string iTxt);

private void UpdateRT(string iTxt)
{
richTextBox1.Text = richTextBox1.Text + iTxt + "\n";
}
到这里你应该清楚,多线程的正确应用.

免责声明:文章转载自《C# 高定位高效率程序中 线程与线程池比较》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇小米手机Root实现一个双缓冲队列下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Eclipse debug 多线程

      以前用到过许多线程开发,对多线程开发也算是小有点心得,但一开始多线程开发的时候,碰到很多壁。但总得来说,有个好的工具总是能事半功倍。我用的工具是eclipse,在开发多线程时,其debug模式是能直接模拟多线程环境的,网上也有许多资料,但大多都不是很全。希望我能够将自己的一些心得记录下来,希望能帮助到还为多线程开发而纠结的朋友。 先写个简单的...

多线程抢票系统浅析

笔者打算写个轻量版的秒杀系统,那么需要多线程模拟客户去抢购某个商品。故有想先写一个简单的多线程抢票系统加深一下对线程池,同步的理解。 1. 新建Java project,命名为ClientApp1, src文件夹里面新建demo文件夹。 项目结构如下,     2. 程序模拟的场景用例如下, 多个线程模拟多个客户去购买春运车票 每个客户购买车票【0,9】...

python 异常处理、进程

目录: 异常处理 python进程 python并发之多进程 一、异常处理(try...except...) 1、程序中难免出现错误,而错误分成两种: a.语法错误: View Code b.逻辑错误(逻辑错误) View Code 2、异常定义:异常就是程序运行时发生错误的信号。 在python中,错误触发的异常,是以异常追踪信息、异常类型、异常值三...

Java面试——多线程面试题总结

0.前言 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分,本文汇总了常见的一些多线程面试题。 一些问题,比如volatile关键词的作用,synchronized和ReentrantLock的区别,wait()和sleep()的区别等等问题,已经在之前写过的文章中提到过了,这里就不赘述了,有兴趣可以查看以下几篇文章:Java并发——线程同...

详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失

在Spring Cloud中我们用Hystrix来实现断路器,Zuul中默认是用信号量(Hystrix默认是线程)来进行隔离的,我们可以通过配置使用线程方式隔离。 在使用线程隔离的时候,有个问题是必须要解决的,那就是在某些业务场景下通过ThreadLocal来在线程里传递数据,用信号量是没问题的,从请求进来,但后续的流程都是通一个线程。 当隔离模式为线程时...

python自动化测试-D9-学习笔记之一(线程池)

# 封装 线程池import threadpoolclass MyPool(object):def __init__(self,func,size=20,data=None):#func 函数,size线程数,data数据self.func = funcself.size = sizeself.data = dataself.pool()def pool(...