返回首页
当前位置: 主页 > 互联网技术 > 网络安全 >

ASP.NET-多线程

时间:2020-04-24 15:01来源:电脑教程学习网 www.etwiki.cn 编辑:小山哥

线程被定义为程序的执行路径。每个线程定义唯一的控制流。如果您的应用程序涉及复杂且耗时的操作(例如数据库访问或某些密集的I / O操作),则设置不同的执行路径或线程(每个线程执行一个特定的工作)通常会很有帮助。

线程是轻量级进程。使用线程的一个常见示例是现代操作系统对并发编程的实现。使用线程可以节省CPU周期,并提高应用程序的效率。

到目前为止,我们已经编译了程序,其中单个线程作为单个进程运行,这是应用程序的运行实例。但是,通过这种方式,应用程序可以一次执行一项工作。为了使其一次执行多个任务,可以将其划分为较小的线程。

在.Net中,线程是通过'System.Threading'名称空间处理的。通过创建System.Threading.Thread类型的变量,您可以创建一个新的线程来开始使用。它允许您创建和访问程序中的各个线程。

创建线程

通过创建Thread对象并为其构造函数提供ThreadStart引用来创建线程。

ThreadStart childthreat = new ThreadStart(childthreadcall);

线程生命周期

线程的生命周期在创建System.Threading.Thread类的对象时开始,在线程终止或完成执行时结束。

以下是线程生命周期中的各种状态:

  • 未启动状态:创建线程实例但未调用Start方法的情况。

  • 就绪状态:这是线程准备执行并等待CPU周期的情况。

  • 不可运行状态:在以下情况下,线程不可运行:

    • 睡眠方法已被调用
    • 等待方法已被调用
    • 被I / O操作阻塞
  • 死状态:这是线程完成执行或已中止的情况。

线程优先级

Thread类的Priority属性指定一个线程相对于另一个线程的优先级。.Net运行时选择优先级最高的就绪线程。

优先级可以归类为:

  • 超出正常水平
  • 低于一般
  • 最高
  • 最低
  • 正常

创建线程后,将使用线程类的Priority属性设置其优先级。

NewThread.Priority = ThreadPriority.Highest;

线程属性和方法

Thread类具有以下重要属性:

属性 描述
CurrentContext 获取线程正在其中执行的当前上下文。
当前文化 获取或设置当前线程的区域性。
当前原理 获取或设置线程的当前主体,以实现基于角色的安全性。
当前线程 获取当前正在运行的线程。
当前UI文化 获取或设置资源管理器用于在运行时查找特定于文化的资源的当前区域性。
执行上下文 获取一个ExecutionContext对象,该对象包含有关当前线程的各种上下文的信息。
活着 获取一个值,该值指示当前线程的执行状态。
IsBackground 获取或设置一个值,该值指示线程是否为后台线程。
IsThreadPoolThread 获取一个值,该值指示线程是否属于托管线程池。
ManagedThreadId 获取当前托管线程的唯一标识符。
名称 获取或设置线程的名称。
优先 获取或设置一个值,该值指示线程的调度优先级。
线程状态 获取一个包含当前线程状态的值。

Thread类具有以下重要方法:

方法 描述
中止 在对其进行调用的线程中引发ThreadAbortException,以开始终止线程的过程。调用此方法通常会终止线程。
分配数据槽 在所有线程上分配一个未命名的数据插槽。为了获得更好的性能,请改用标有ThreadStaticAttribute属性的字段。
AllocateNamedDataSlot 在所有线程上分配一个命名数据插槽。为了获得更好的性能,请改用标有ThreadStaticAttribute属性的字段。
BeginCriticalRegion 通知主机执行将要进入的代码区域,其中线程中止或未处理的异常的影响可能会危害应用程序域中的其他任务。
BeginThreadAffinity 通知主机托管代码即将执行取决于当前物理操作系统线程身份的指令。
关键区域 通知主机执行将要进入的代码区域,其中线程中止或未处理异常的影响仅限于当前任务。
EndThreadAffinity 通知主机托管代码已完成执行取决于当前物理操作系统线程标识的指令。
FreeNamedDataSlot 消除了进程中所有线程的名称和插槽之间的关联。为了获得更好的性能,请改用标有ThreadStaticAttribute属性的字段。
获取数据 从当前线程的当前域内的当前线程的指定插槽中检索值。为了获得更好的性能,请改用标有ThreadStaticAttribute属性的字段。
获取域 返回当前线程正在其中运行的当前域。
GetDomainID 返回唯一的应用程序域标识符。
GetNamedDataSlot 查找命名数据槽。为了获得更好的性能,请改用标有ThreadStaticAttribute属性的字段。
打断 中断处于WaitSleepJoin线程状态的线程。
加入 阻塞调用线程,直到线程终止,同时继续执行标准COM和SendMessage泵送。此方法具有不同的重载形式。
内存屏障 同步存储器访问,如下所示:执行当前线程的处理器无法以这样的方式对指令进行重新排序,即在对MemoryBarrier的调用之后进行的存储器访问之后,在执行对MemoryBarrier的调用之前执行存储器访问。
ResetAbort 取消请求当前线程的中止。
设定数据 在该线程当前域的当前运行线程的指定插槽中设置数据。为了获得更好的性能,请改用标有ThreadStaticAttribute属性的字段。
开始 启动线程。
睡觉 使线程暂停一段时间。
旋转等待 使线程等待迭代参数定义的次数。
VolatileRead() 读取字段的值。该值是计算机中任何处理器写入的最新值,而不管处理器数量或处理器缓存的状态如何。此方法具有不同的重载形式。
VolatileWrite() 立即将值写入字段,以便该值对计算机中的所有处理器可见。此方法具有不同的重载形式。
产量 使调用线程让执行权转交给准备在当前处理器上运行的另一个线程。操作系统选择要屈服的线程。

以下示例说明了Thread类的用法。该页面具有标签控件,用于显示来自子线程的消息。使用Response.Write()方法直接显示来自主程序的消息。因此,它们出现在页面顶部。

源文件如下:

<%@ 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 ms,在此期间执行子线程。

  • 子线程一直运行到被主线程中止为止。它引发ThreadAbortException并终止。

  • 控制返回到主线程。

执行后,程序将发送以下消息:

ASP.NET线程
 上一页  打印页面

------分隔线----------------------------
标签(Tag):
------分隔线----------------------------
推荐内容
  • ASP.NET-配置

    ASP.NET应用程序的行为会受到配置文件中不同设置的影响: machine.config web.config ...

  • ASP.NET-多线程

    线程被定义为程序的执行路径。 每个线程定义唯一的控制流。 如果您的应用程序涉及复杂...

  • ASP.NET-Web服务

    Web服务是一种基于Web的功能,使用将由Web应用程序使用的Web协议进行访问。 Web服务开...

  • ASP.NET-数据缓存

    什么是缓存? 缓存是一种将频繁使用的数据/信息存储在内存中的技术,因此,当下次需要...

  • ASP.NET-安全

    在站点中实现安全性具有以下方面: 认证 :这是确保用户身份和真实性的过程。 ASP.NET...

  • ASP.NET-LINQ

    大多数应用程序都以数据为中心,但是大多数数据存储库都是关系数据库。 多年来,设计...

猜你感兴趣