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. c#中实现登陆窗口(无需隐藏)

    C#登录窗口的实现,特点就是不用隐藏. 在入口处打开登陆: static void Main() { Application.EnableVisualStyles(); Application.Set ...

  2. Oracle 10g的空间管理

    一.表空间(包含表.字段.索引) 1.定义:表空间是一个逻辑概念,实质是组织数据文件的一种途径. 2.创建表空间 --创建表空间 create tablespace myspace datafile ...

  3. Power Designer导出实体类和NHibernate xml文件

    Power Designer导出实体类和NHibernate xml文件 今天研究了一下通过PowerDesigner生成实体类和NHibernate所需要的xml文件,方法是通过Power Desi ...

  4. [原]iOS中 Web 页面与 Native Code 的一种通信方式

    在 iOS 开发中,Web 页面与 Native Code 通信可以分为两个方面: 1.Native Code 调用 Web 页面的方法:主要是调用页面中的 Javascript 函数. 2.Web ...

  5. 企业架构研究总结(37)——TOGAF企业连续体和工具之架构资源库及架构工具的选择

    3. 架构资源库 在一个企业,尤其是在一个大型企业中,建设一个成熟的架构往往会产生大量的工作产品.为了很好地管理和利用这些工作产品,企业需要制定一个正式的针对不同类型架构资产的分类方法,并且还需要专门 ...

  6. iOS学习之路十三(动态调整UITableViewCell的高度)

    大概你第一眼看来,动态调整高度是一件不容易的事情,而且打算解决它的第一个想法往往是不正确的.在这篇文章中我将展示如何使图表单元格的高度能根据里面文本内容来动态改变,同时又不必子类化UITableVie ...

  7. 系统架构、网络通信、IM、视频会议技术

    专注于系统架构.网络通信.IM.视频会议技术. 主要作品: ESFramework 强悍的通信框架.P2P框架.群集平台. OMCS 简单易用的 网络语音视频 框架. MFile 语音视频录制组件. ...

  8. Windows 安装Mongoliadb

    1. 下载 下载地址: http://www.mongodb.org/downloads 我这里用的是:mongodb-win32-x86_64-2008plus-2.4.5.zip 2. 设置目录 ...

  9. C# BackgroundWorker详解,图例,原理分析

    先声明,大部分资料均参考网上,进行了整理. 1. 在 VS 中添加了 BackgroundWorker 组件, 该组件在多线程编程方面使用起来非常 方便,然而在开始时由于没有搞清楚它的使用机制, 走了 ...

  10. SQL Server监控清单

    SQL Server监控清单 一. 服务器1. 状态监控(1) 服务器是否可访问?(2) 相应的数据库服务是否启用?(3) 操作系统事件日志中的错误或告警(4) 磁盘可用空间 服务器状态监控,不管使用 ...