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的使用.另一篇文章(点击查看),和上述文章内容差不多.
随机推荐
- c# UDP/TCP协议简单实现(简单聊天工具)
长时间没有摸这两个协议,写个代码温习下 下面是界面 [服务器界面] [登陆界面] [好友列表界面(我登陆了2个)] [聊天界面] 下面大致讲解下用到的内容 1.用户登陆于服务器通信用到的tcp协议,服 ...
- C/C++基础知识总结——数组、指针域、字符串
1. 数组 1.1 数组作为函数参数 (1) 如果使用数组作为函数的参数,则实参和形参都是数组名,且类型要相同.数组名做参数时传递的是地址 (2) 使用方法: void rowSum(int a[][ ...
- Linux下获取硬盘使用情况
Linux下获取硬盘使用情况[总结] 1.前言 在嵌入式设备中,硬盘空间非常有限,在涉及到经常写日志的进程时候,需要考虑日志的大小和删除,不然很快就硬盘写满,导致日志程序崩溃.为了捕获硬盘写满的异常场 ...
- 对中级 Linux 用户有用的 20 个命令
也许你已经发现第一篇文章非常的有用,这篇文章是继对初级Linux用户非常有用的20个命令的一个延伸. 第一篇文章的目的是为新手准备的而这篇文章则是为了Linux的中高级用户.在这里你将学会如何进行自定 ...
- Nginx 配置基于域名的虚拟
编辑配置文件 vi /etc/nginx/nginx.conf user www www; worker_processes 2; error_log logs/error.log not ...
- JS简单验证密码强度
<input type="password" id="password" value=""/><button id=&qu ...
- CentOS中安装Python-PIP
wget http://pypi.python.org/packages/source/p/pip/pip-1.0.2.tar.gz tar zxf pip-1.0.2.tar.gz cd pip-1 ...
- JS实现以日历形式显示当前时间
效果图: <script language="Javascript"> var datelocalweek=new Array("星期日", &qu ...
- linux history 命令详解
linux history 命令详解 显示命令执行时间 linux shell 具有history 功能,即会记录已经执行过的命令,但是默认是不显示命令的执行时间,命令的执行时间,history 已经 ...
- 使用 javascript 来实现 观察者模式
以[猫叫.老鼠跑.主人醒]为例子,使用 javascript 来实现 观察者模式 (有在线演示) 2013-06-24 08:35 by 金色海洋(jyk)阳光男孩, 572 阅读, 4 评论, 收藏 ...