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——初识多线程的更多相关文章

  1. delphi 线程教学第一节:初识多线程

    第一节:初识多线程   1.为什么要学习多线程编程?   多线程(多个线程同时运行)编程,亦可称之为异步编程. 有了多线程,主界面才不会因为耗时代码而造成“假死“状态. 有了多线程,才能使多个任务同时 ...

  2. Asp.Net在多线程环境下的状态存储问题

    在应用开发中,我们经常需要设置一些上下文(Context)信息,这些上下文信息一般基于当前的会话(Session),比如当前登录用户的个人信息:或者基于当前方法调用栈,比如在同一个调用中涉及的多个层次 ...

  3. C#夯实基础之多线程一:初识多线程

    一. 烧水沏茶问题       在小学四年级有一个烧水沏茶问题,可以作为我们今天讨论话题的引子: 客人来了,要烧一壶茶,但是烧水需要5分钟,洗水壶需要1分钟,洗茶杯需要2分钟,接水需要1分钟,找茶叶需 ...

  4. asp.net初识

    请求=========处理=============响应 不是服务器读网页.表单,而是我们向服务器提交数据 1.asp.net 服务器端控件是ASP.NET对HTML的封装,ASP.NET会将服务器端 ...

  5. Asp.Net - 8.多线程

    8.1 概念 进程(Process):是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.进程之间是相对独立的,一个进程无法直接访问另一个进程的数据(除非利用分布式计算方式),一个 ...

  6. ASP.NET 初识Cookie

    1.ASP.NET中使用Cookie 0.说明 Cookie存在客户端电脑上,Session存在服务器上,所以保存登录信息等敏感信息时不能使用Cookie,用户个性化设置可以使用Cookie 1.新建 ...

  7. Java学习 · 初识 多线程

    多线程 1. 基础概念 a)     程序 Program i.           静态代码,指令集,应用程序执行的蓝本 b)    进程 Process i.           动态概念,正在运 ...

  8. asp.net 后台多线程异步处理时的 进度条实现一(Ajax+Ashx实现以及封装成控件的实现)

    (更新:有的同学说源代码不想看,说明也不想看,只想要一个demo,这边提供一下:http://url.cn/LPT50k (密码:TPHU)) 工作好长时间了,这期间许多功能也写成了不少的控件来使用, ...

  9. asp.net --> 初识WCF

    对于刚开始接触wcf的同志,可以有效的理解wcf的使用场景. 引用该文章(点击查看),简单的介绍wcf的使用.另一篇文章(点击查看),和上述文章内容差不多.

随机推荐

  1. Java菜鸟学习笔记--面向对象篇(十八):对象转型&多态

    Polymorphism[多态] 简述: 面向对象多态性指的是:发送消息给某个对象,让该对象自行决定响应何种行为. 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用 多态的三个前提条件: 多 ...

  2. seajs代码

    打包并压缩seajs代码 背景 seajs是一款优秀的模块开发插件,但是当我们使用它来进行模块化开发的时候,由于它的每个模块的加载都会进行一次http请求,那么当模块数量倍增的时候,会拖慢页面的加载速 ...

  3. 温故而知新之java的collection framwork

    经常用到的List,Map等这些数据结构,都是来自于java的util包下,而java对于其整体设计,简称为collection framwork.(ps.其实,Map接口并不继承自collectio ...

  4. CNN for Visual Recognition (02)

    图像分类 参考:http://cs231n.github.io/classification/ 图像分类(Image Classification),是给输入图像赋予一个已知类别标签.图像分类是计算机 ...

  5. ASP.NET Web API的核心对象:HttpController

    ASP.NET Web API的核心对象:HttpController 对于ASP.NET Web API来说,所谓的Web API定义在继承自ApiController的类中,可能ApiContro ...

  6. Window Service 计划任务

    在ASP.NET中创建计划任务,就我个人而言,用过两种方式,一种是用SQL Server创建,把写好的SSIS包导入SQL Server创建的任务中,设置好时间让它去执行.还有一种就是利用window ...

  7. 大数据应用日志采集之Scribe 安装配置指南

    大数据应用日志采集之Scribe 安装配置指南 大数据应用日志采集之Scribe 安装配置指南 1.概述 Scribe是Facebook开源的日志收集系统,在Facebook内部已经得到大量的应用.它 ...

  8. POJ 1873 The Fortified Forest

    题意:是有n棵树,每棵的坐标,价值和长度已知,要砍掉若干根,用他们围住其他树,问损失价值最小的情况下又要长度足够围住其他树,砍掉哪些树.. 思路:先求要砍掉的哪些树,在求剩下的树求凸包,在判是否可行. ...

  9. C# 线程池的使用

    C#使用Thread多线程时,经常会用到多个线程都执行完后再进行下一步操作,以前的做法是设置全局变量来标识,后来看到了线程池的概念,简单的记录下来,示例代码如下: ManualResetEvent m ...

  10. C#中数组,ArrayList与List对象的区别

    在C#中,当我们想要存储一组对象的时候,就会想到用数组,ArrayList,List这三个对象了.那么这三者到底有什么样的区别呢? 我们先来了解一下数组,因为数组在C#中是最早出现的. 数组 数组有很 ...