- 第1节:ASP.NET 简介
- 第2节:ASP.NET 环境设置
- 第3节:ASP.NET 生命周期
- 第4节:ASP.NET 实例
- 第5节:ASP.NET 事件处理
- 第6节:ASP.NET 服务器端
- 第7节:ASP.NET ADO.NET
- 第8节:ASP.NET 服务器控件
- 第9节:ASP.NET 文件上传
- 第10节:ASP.NET HTML 服务器
- 第11节:ASP.NET 广告轮转器
- 第12节:ASP.NET 客户端
- 第13节:ASP.NET 日历
- 第14节:ASP.NET 基础控件
- 第15节:ASP.NET 多视图
- 第16节:ASP.NET 指令
- 第17节:ASP.NET Panel 控件
- 第18节:ASP.NET 管理状态
- 第19节:ASP.NET Ajax 控制
- 第20节:ASP.NET 验证器
- 第21节:ASP.NET 数据源
- 第22节:ASP.NET 数据库存取
- 第23节:ASP.NET 数据绑定
- 第24节:ASP.NET 自定义控件
- 第25节:ASP.NET 个性化
- 第26节:ASP.NET 异常处理
- 第27节:ASP.NET 调试
- 第28节:ASP.NET 语言集成查询
- 第29节:ASP.NET 安全性
- 第30节:ASP.NET 数据缓存
- 第31节:ASP.NET Web 服务
- 第32节:ASP.NET 多线程
- 第33节:ASP.NET 配置
- 第34节:ASP.NET 部署
ASP.NET 多线程
多线程
一个线程被定义为一个程序的执行路径。每个线程都定义了一个独特的流量控制。如果你的应用程序涉及到复杂的和耗时的操作,如数据库访问或一些激烈的 I/O 操作,那么往往设置不同的执行路径或线程,每个线程执行一个特定的工作是非常有益的。
线程是轻量级的进程。使用线程的一个常见的例子是现代操作系统并行编程的的实现。使用线程节省了 CPU 周期的损失,提高了应用效率。
到目前为止我们编译好的程序在一个线程作为一个单一的过程运行,即是应用程序的运行实例。然而,这样的应用程序只可以在某一时刻执行一个工作。让它在同一时间执行多个任务,可以把它分成更小的线程。
在 .Net ,线程是通过 ‘System.Threading’ 的命名空间处理的。创造的 system.threading.thread 类型的变量允许你创建一个新线程开始工作。它允许你在一个单独的线程创建和访问独立的线程。
创建线程
一个线程是由一个线程对象创建的,并给出了它的构造函数的开启线程的参考。
ThreadStart childthreat = new ThreadStart(childthreadcall);
线程生命周期
一个线程的生命周期开始于 system.threading.thread 类的一个对象被创建,结束于线程被终止或执行完成。
以下是在一个线程的生命周期的各种状态:
- 待开启状态:该线程的实例被创建但启动方法还未被调用的情况。
- 就绪状态: 当线程准备好执行并且在等待 CPU 周期的情况。
- 不可运行状态:线程不能被运行的情况,有以下几种可能:
- 当前睡眠的方法被调用
- 等待的方法被调用
- 被 I/O 操作阻塞
- 死亡状态:线程执行完毕或已中止的情况。
线程优先权
Thread 类中的优先级属性主要是相对于其他线程指定一个线程的优先级。 .NET 运行时选择具有最高优先级的就绪线程。优先权可分为:
- 高于正常
- 低于正常
- 最高
- 最低
- 正常
一旦一个线程被创建,系统就会使用 Thread 类的优先级设置系统设定好它的优先级。
NewThread.Priority = ThreadPriority.Highest;
线程的属性和方法
线程类具有以下重要特性:
线程类具有以下重要方法:
例子
下面的例子阐明了对线程类的使用。该页面有一个控制标签显示子线程传来的消息。从主程序传来的消息直接使用 response.write(50) 的方法显示出来,因此它们出现在页面的顶部。
源文件如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="threaddemo._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>
Untitled Page
</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h3>Thread Example</h3>
</div>
<asp:Label ID="lblmessage" runat="server" Text="Label">
</asp:Label>
</form>
</body>
</html>
后台代码如下:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Threading;
namespace threaddemo
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ThreadStart childthreat = new ThreadStart(childthreadcall);
Response.Write("Child Thread Started <br/>");
Thread child = new Thread(childthreat);
child.Start();
Response.Write("Main sleeping for 2 seconds.......<br/>");
Thread.Sleep(2000);
Response.Write("<br/>Main aborting child thread<br/>");
child.Abort();
}
public void childthreadcall()
{
try{
lblmessage.Text = "<br />Child thread started <br/>";
lblmessage.Text += "Child Thread: Coiunting to 10";
for( int i =0; i<10; i++)
{
Thread.Sleep(500);
lblmessage.Text += "<br/> in Child thread </br>";
}
lblmessage.Text += "<br/> child thread finished";
}catch(ThreadAbortException e){
lblmessage.Text += "<br /> child thread - exception";
}finally{
lblmessage.Text += "<br /> child thread - unable to catch the exception";
}
}
}
}
观察以下:
- 当页面被加载时,一个新的线程会以 childthreadcall() 为参考开始启动。主线程的活动会直接显示在网页。
- 第二个线程运行并将消息发送到控制标签。
- 在子线程执行时主线程休眠 2000 毫秒。
- 子线程持续运行直到它被主线程中止,然后它会抛出 ThreadAbortException 异常并被终止。
- 控制返回到主线程。