asp.net——初识多线程
1.首先讲解一下什么是线程(该定义是参考线程的百度百科)
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
2.为什么要用多线程?
让计算机“同时”做多个事情,节约时间;后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况;多线程可以让一个程序“同时”处理多个事情;计算机CPU大部分时间处于空闲状态,浪费了大量的CPU资源。
一个进程至少有一个默认的线程为主线程。
下面写一个程序来说明单线程带来的问题。新建一个window窗体(该进程的UI线程为主线程),在窗体上拖一个button控件,添加该button的双击事件,写如下代码:
//单线程的缺点
private void button1_Click(object sender, EventArgs e)
{
DateTime beginTime = DateTime.Now;
for (int i = ; i < ; i++)
{ }
TimeSpan ts = beginTime.Subtract(DateTime.Now); MessageBox.Show("循环执行完毕)" + ts.TotalMilliseconds);
}
运行该程序,可以发现当点击了button按钮以后,window窗体不可以移 动,只有弹出“循环执行完毕”之后窗体才可以被移动。这就是单线程的缺点,CUP让UI线程执行单击事件引发的程序,不能在执行UI线程本来做的事情,这 就好比一个前台服务员本来该接待客户,但是她去忙别的事情了,导致她不能接待客户了。即她不能一边接待客户一边去忙别的事情。
为了解决这个问题,引入了多线程的概念,现在写一个程序来说明利用多线程是如何解决上述程序的问题的。在上面新建的窗体上再拖一个button,添加该button的双颊事件,写如下代码:
void CountTimes()
{
DateTime beginTime = DateTime.Now;
for (int i = ; i < ; i++)
{ }
TimeSpan ts = beginTime.Subtract(DateTime.Now); MessageBox.Show("循环执行完毕)" + ts.TotalMilliseconds);
}
//使用多线程来解决UI卡死问题
private void button2_Click(object sender, EventArgs e)
{
//创建线程对象 传入 委托线程执行的方法
Thread ts = new Thread(CountTimes);
//启动线程 执行方法
ts.Start();
//将线程设置为后台线程(当所有的前台线程结束后,后台线程会自动退出)
//ts.IsBackground = true;//将该线程设置为后台线程
}
3. .net中如何实现多线程1
线程肯定也是要执行一段代码的,所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码(找个人来做一件事情);线程启动时 ,通过委托调用该方法(线程启动时,调用传过来的委托,委托就会执行相应的方法,实现线程执行方法)
4. .net中如何实现多线程2
产生一个线程的4步骤:编写产生线程所要执行的方法;引用 System.Threading命名空间;实例化Thread类,并传入一个指向线程所要运行方法的委托(这时候这个线程已经产生,但是还没有运行); 调用Thread实例的Start方法,标记该线程可以被CUP执行了,但是具体执行时间由CUP决定。
5.前台线程:只有所有的前台线程都关闭才能完成程序关闭时;后台线程:只要所有的前台线程结束,后台线程自动结束。
6.方法重入问题:
新建一个window窗体,拖一个button控件和一个textbox控件,修改textbox控件的text属性值为0,添加该button按钮的双击事件,写如下代码:
void ChangeText()
{
for (int i = ; i < ; i++)
{
int a = int.Parse(textBox1.Text);
Console.WriteLine(Thread.CurrentThread.Name+",a="+a+",i="+i);
a++;
textBox1.Text = a.ToString();
}
}
//方法重入问题
private void button3_Click(object sender, EventArgs e)
{
Thread thread1 = new Thread(ChangeText);
thread1.Name = "t1";
thread1.Start(); }
运行该程序,系统会报错“线程间操作无效: 从不是创建控件“textBox1”的线程访问它。”这是因为创建textbox的线程不是咱们在button3_Click事件里边new的线程,线程之间是相互独立的。(对线程了解不是太多,自己的浅见)
public Form1()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls = false;//关掉微软对错误线程的调用
}
通过写上一句代码,可以关掉微软对错误线程的调用。
void ChangeText()
{
for (int i = ; i < ; i++)
{
int a = int.Parse(textBox1.Text);
Console.WriteLine(Thread.CurrentThread.Name+",a="+a+",i="+i);
a++;
textBox1.Text = a.ToString();
}
}
//方法重入问题
private void button3_Click(object sender, EventArgs e)
{
Thread thread1 = new Thread(ChangeText);
thread1.Name = "t1";
thread1.IsBackground = true;//将该线程设置为后台线程是为了防止用户在运行过程中关闭窗体而引发的错误
thread1.Start(); Thread thread2 = new Thread(ChangeText);
thread2.Name = "t2";
thread2.IsBackground = true;
thread2.Start();
}
观察该程序的运行结果可以看出两个线程是相互独立的,两个线程在执行同一个方法时并不相互影响。
asp.net——初识多线程的更多相关文章
- delphi 线程教学第一节:初识多线程
第一节:初识多线程 1.为什么要学习多线程编程? 多线程(多个线程同时运行)编程,亦可称之为异步编程. 有了多线程,主界面才不会因为耗时代码而造成“假死“状态. 有了多线程,才能使多个任务同时 ...
- Asp.Net在多线程环境下的状态存储问题
在应用开发中,我们经常需要设置一些上下文(Context)信息,这些上下文信息一般基于当前的会话(Session),比如当前登录用户的个人信息:或者基于当前方法调用栈,比如在同一个调用中涉及的多个层次 ...
- C#夯实基础之多线程一:初识多线程
一. 烧水沏茶问题 在小学四年级有一个烧水沏茶问题,可以作为我们今天讨论话题的引子: 客人来了,要烧一壶茶,但是烧水需要5分钟,洗水壶需要1分钟,洗茶杯需要2分钟,接水需要1分钟,找茶叶需 ...
- asp.net初识
请求=========处理=============响应 不是服务器读网页.表单,而是我们向服务器提交数据 1.asp.net 服务器端控件是ASP.NET对HTML的封装,ASP.NET会将服务器端 ...
- Asp.Net - 8.多线程
8.1 概念 进程(Process):是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.进程之间是相对独立的,一个进程无法直接访问另一个进程的数据(除非利用分布式计算方式),一个 ...
- ASP.NET 初识Cookie
1.ASP.NET中使用Cookie 0.说明 Cookie存在客户端电脑上,Session存在服务器上,所以保存登录信息等敏感信息时不能使用Cookie,用户个性化设置可以使用Cookie 1.新建 ...
- Java学习 · 初识 多线程
多线程 1. 基础概念 a) 程序 Program i. 静态代码,指令集,应用程序执行的蓝本 b) 进程 Process i. 动态概念,正在运 ...
- asp.net 后台多线程异步处理时的 进度条实现一(Ajax+Ashx实现以及封装成控件的实现)
(更新:有的同学说源代码不想看,说明也不想看,只想要一个demo,这边提供一下:http://url.cn/LPT50k (密码:TPHU)) 工作好长时间了,这期间许多功能也写成了不少的控件来使用, ...
- asp.net --> 初识WCF
对于刚开始接触wcf的同志,可以有效的理解wcf的使用场景. 引用该文章(点击查看),简单的介绍wcf的使用.另一篇文章(点击查看),和上述文章内容差不多.
随机推荐
- Winform系列
小菜学习编程-Winform系列(初学者) 前言 记得上次写<小菜的程序员道路(二)>,这篇文章的时候说过,要把工作以来整理的编程知识分享给大家,因为这半年来的工作实在是忙,现在也在忙 ...
- Jquery文本框值改变事件兼容性
Jquery文本框值改变事件(支持火狐.ie) Jquery值改变事件支持火狐和ie浏览器,并且测试通过,绑定后台代码可以做成autocomplete控件. 具体代码列举如下: ? $(docum ...
- IceMx.Mvc 我的js MVC 框架五、完善植物大战僵尸(雏形版增加动画)
有图有真相 说明 实在找不到僵尸的素材,从网上扒了一个山寨的僵尸,只有4张的一个连续图片,所以动作有点僵硬,植物的图片是自己处理的,非专业所以……咳咳!. 背景是自己抠下来2块儿拼接的,看在这么辛苦的 ...
- 转--htaccess语法教程 apache服务器伪静态规则教程
转自:http://blog.csdn.net/qingli518/article/details/9118361 htaccess语法教程apache服务器伪静态规则教程 注:如果你是为了找Disc ...
- 解决MSSQL 2008不能用IP登录的问题
解决MSSQL 2008不能用IP登录的问题 前提准备:mssql 2008已安装好了一个实例(我按默认情况下安装的实例是:SQLEXPRESS),并安装了SQL Server Manag ...
- Arduino 各种模块篇 RGB LED灯
示例代码: 类似与这样的led,共阴rgb led,通过调节不同的亮度,组合成不同的颜色. 示例代码: /* 作者:极客工坊 时间:2012年12月18日 IDE版本号:1.0.1 发布地址:www. ...
- 输入参数能动态调决定调用哪个实现类 spring的一个特性
今天做公司的以前项目的时候发现项目中有个特别好的东西,记录下来,分享一下 发现spring有个这样的功能,我也不知道这个是东西应该怎么称呼,就是通过输入参数,动态决定调用接口的实现类.简单理解就是在s ...
- 微软必应借PK谷歌突围中国搜索市场
Bing“必应”是微软2009年推出的搜索品牌(http://www.bing.com),它取代的是同门师兄Live Search.进入2013年,在国内及好莱坞的多部大片里面,我都看到了Bing搜索 ...
- PHP之语言基础01 By ACReaper
1.PHP中的变量是不需要声明类型的,由$标识变量,变量的命名规则也是字母或者下划线开头,接着任意字符或者下划线. $PI = 3.14; $radius = 5; $cir = $PI * 2 * ...
- 回收站引发ORACLE查询表空间使用缓慢
一个哥们问我 ,他们查询 表空间使用率 跑了一个多小时,这个太坑爹了,让我 帮忙优化一下. SQL语句如下 select * from ( select ts.tablespace_name,ts.c ...