在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C#/ ASP.NET多線程
ASP.NET調(diào)試
ASP.NET Web Services
ASP.NET緩存
ASP.NET多線程
ASP.NET面板控件
ASP.NET數(shù)據(jù)綁定
ASP.NET數(shù)據(jù)源
ASP.NET個(gè)性化
ASP.Net教程
ASP.NET Ajax控件
ASP.NET生命周期
ASP.NET HTML服務(wù)器
ASP.NET簡(jiǎn)介
ASP.NET驗(yàn)證器
ASP.NET多視圖
ASP.NET網(wǎng)站配置
ASP.NET錯(cuò)誤管理
ASP.NET自定義控件
ASP.NET LINQ
ASP.NET AdRotator控件
ASP.NET客戶(hù)端
ASP.NET文件上傳
ASP.NET服務(wù)器控件
ASP.NET開(kāi)發(fā)環(huán)境配置
ASP.NET管理狀態(tài)
ASP.NET服務(wù)端
ASP.NET數(shù)據(jù)庫(kù)訪問(wèn)(Access)
ASP.NET基本控件
ASP.NET安全
ASP.NET指令
ASP.NET事件處理
ASP.NET第一個(gè)程序
ASP.NET日歷控件

ASP.NET多線程

線程被定義為程序的執(zhí)行路徑。 每個(gè)線程定義一個(gè)獨(dú)特的控制流程。 如果應(yīng)用程序涉及復(fù)雜和耗時(shí)的操作(如數(shù)據(jù)庫(kù)訪問(wèn)或某些緊張的I/O操作),那么設(shè)置不同的執(zhí)行路徑或線程通常會(huì)很有幫助,每個(gè)線程都執(zhí)行特定的工作。

線程是輕量級(jí)的過(guò)程。 使用線程的一個(gè)常見(jiàn)例子是由現(xiàn)代操作系統(tǒng)實(shí)現(xiàn)并發(fā)編程。 線程的使用節(jié)省了CPU周期的浪費(fèi)并提高了應(yīng)用程序的效率。

到目前為止,我們編譯的程序中,是以單個(gè)線程作為應(yīng)用程序運(yùn)行的實(shí)例來(lái)運(yùn)行。 但是,這樣應(yīng)用程序一次可以只可執(zhí)行一項(xiàng)工作。 為了一次執(zhí)行多個(gè)任務(wù),可以將其分成更小的線程。

在.Net中,線程是通過(guò)System.Threading命名空間處理的。 創(chuàng)建System.Threading.Thread類(lèi)型的變量允許您創(chuàng)建一個(gè)新的線程開(kāi)始使用。它允許創(chuàng)建和訪問(wèn)程序中的各個(gè)線程。

創(chuàng)建線程

一個(gè)線程是通過(guò)創(chuàng)建一個(gè)Thread類(lèi)的對(duì)象來(lái)創(chuàng)建的,給它的構(gòu)造器一個(gè)ThreadStart引用。

ThreadStart childthreat = new ThreadStart(childthreadcall);

線程生命周期

線程的生命周期在System.Threading.Thread類(lèi)的對(duì)象被創(chuàng)建時(shí)開(kāi)始,并在線程被終止或完成執(zhí)行時(shí)結(jié)束。

以下是線程生命周期中的各種狀態(tài):

  • 未開(kāi)始狀態(tài):創(chuàng)建線程實(shí)例但未啟動(dòng)Start方法的情況。
  • 就緒狀態(tài):線程準(zhǔn)備執(zhí)行并等待CPU周期的情況。
  • 不可運(yùn)行狀態(tài):一個(gè)線程不可運(yùn)行,當(dāng):
    • Sleep方法已被調(diào)用
    • Wait方法已被調(diào)用
    • 被I/O操作阻止
  • 死亡狀態(tài):線程完成執(zhí)行或被中止的情況。

線程優(yōu)先

Thread類(lèi)的Priority屬性指定一個(gè)線程相對(duì)于其他線程的優(yōu)先級(jí)。 .Net運(yùn)行時(shí)選擇具有最高優(yōu)先級(jí)的就緒線程。

優(yōu)先級(jí)可以被分類(lèi)為:

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

當(dāng)線程被創(chuàng)建,它的優(yōu)先級(jí)就使用線程類(lèi)的Priority屬性來(lái)設(shè)置。

NewThread.Priority = ThreadPriority.Highest;

線程屬性和方法

Thread類(lèi)具有以下重要的屬性:

編號(hào) 屬性 描述
1 CurrentContext 獲取線程正在執(zhí)行的當(dāng)前上下文。
2 CurrentCulture 獲取或設(shè)置當(dāng)前線程的文化。
3 CurrentPrinciple 獲取或設(shè)置線程當(dāng)前的基于角色的安全性的主體。
4 CurrentThread 獲取當(dāng)前正在運(yùn)行的線程。
5 CurrentUICulture 獲取或設(shè)置資源管理器在運(yùn)行時(shí)查找文化特定資源的當(dāng)前文化。
6 ExecutionContext 獲取一個(gè)ExecutionContext對(duì)象,其中包含有關(guān)當(dāng)前線程的各種上下文的信息。
7 IsAlive 獲取一個(gè)指示當(dāng)前線程執(zhí)行狀態(tài)的值。
8 IsBackground 獲取或設(shè)置一個(gè)值,該值指示線程是否為后臺(tái)線程。
9 IsThreadPoolThread 獲取一個(gè)值,該值指示線程是否屬于托管線程池。
10 ManagedThreadId 獲取當(dāng)前托管線程的唯一標(biāo)識(shí)符。
11 Name 獲取或設(shè)置線程的名稱(chēng)。
12 Priority 獲取或設(shè)置一個(gè)指示線程調(diào)度優(yōu)先級(jí)的值。
13 ThreadState 獲取包含當(dāng)前線程狀態(tài)的值。

Thread類(lèi)具有以下重要的方法:

編號(hào) 方法 描述
1 Abort 在調(diào)用它的線程中引發(fā)ThreadAbortException異常,以開(kāi)始終止線程的過(guò)程。 調(diào)用這個(gè)方法通常會(huì)終止線程。
2 AllocateDataSlot 在所有線程上分配一個(gè)未命名的數(shù)據(jù)插槽。為了獲得更好的性能,請(qǐng)使用ThreadStaticAttribute屬性標(biāo)記字段。
3 AllocateNamedDataSlot 在所有線程上分配一個(gè)指定的數(shù)據(jù)插槽。 為了獲得更好的性能,請(qǐng)使用ThreadStaticAttribute屬性標(biāo)記字段。
4 BeginCriticalRegion 通知主機(jī)執(zhí)行即將進(jìn)入一個(gè)線程中止或未處理異常的影響可能危及應(yīng)用程序域中的其他任務(wù)的代碼區(qū)域。
5 BeginThreadAffinity 通知主機(jī)托管代碼即將執(zhí)行取決于當(dāng)前物理操作系統(tǒng)線程標(biāo)識(shí)的指令。
6 EndCriticalRegion 通知主機(jī)執(zhí)行即將進(jìn)入一個(gè)線程中止或未處理異常的影響被限制在當(dāng)前任務(wù)的代碼區(qū)域。
7 EndThreadAffinity 通知主機(jī),托管代碼已經(jīng)完成執(zhí)行取決于當(dāng)前物理操作系統(tǒng)線程的標(biāo)識(shí)的指令。
8 FreeNamedDataSlot 消除進(jìn)程中所有線程的名稱(chēng)和插槽之間的關(guān)聯(lián)。 為了獲得更好的性能,請(qǐng)使用標(biāo)記為ThreadStaticAttribute屬性字段。
9 GetData 從當(dāng)前線程的當(dāng)前域內(nèi)的當(dāng)前線程的指定插槽中檢索值。 為了獲得更好的性能,請(qǐng)使用標(biāo)記為ThreadStaticAttribute屬性字段。
10 GetDomain 返回當(dāng)前線程正在運(yùn)行的當(dāng)前域。
11 GetDomainID 返回唯一的應(yīng)用程序域標(biāo)識(shí)符。
12 GetNamedDataSlot 查找一個(gè)命名的數(shù)據(jù)插槽。 為了獲得更好的性能,請(qǐng)使用ThreadStaticAttribute屬性標(biāo)記字段。
13 Interrupt 中斷處于WaitSleepJoin線程狀態(tài)的線程。
14 Join 阻塞調(diào)用線程,直到線程終止,同時(shí)繼續(xù)執(zhí)行標(biāo)準(zhǔn)COM和SendMessage抽取。這種方法有不同的重載形式。
15 MemoryBarrier 同步內(nèi)存訪問(wèn),如下所示:執(zhí)行當(dāng)前線程的處理器不能重新排序指令,以便在調(diào)用MemoryBarrier之前執(zhí)行內(nèi)存訪問(wèn)之后,訪問(wèn)MemoryBarrier調(diào)用之后的內(nèi)存訪問(wèn)。
16 ResetAbort 取消當(dāng)前線程所請(qǐng)求的中止。
17 SetData 在當(dāng)前正在運(yùn)行的線程的指定槽中設(shè)置該線程當(dāng)前域的數(shù)據(jù)。為了獲得更好的性能,請(qǐng)使用標(biāo)記為ThreadStaticAttribute屬性的字段。
18 Start 開(kāi)始一個(gè)線程。
19 Sleep 使線程暫停一段時(shí)間。
20 SpinWait 使線程等待迭代參數(shù)定義的次數(shù)。
21 VolatileRead() 讀取一個(gè)字段的值。該值是計(jì)算機(jī)中任何處理器寫(xiě)入的最新值,無(wú)論處理器的數(shù)量或處理器高速緩存的狀態(tài)如何。這種方法有不同的重載形式。
22 VolatileWrite() 立即將值寫(xiě)入字段,以便計(jì)算機(jī)中的所有處理器都可以看到該值。 這種方法有不同的重載形式。
23 Yield 使調(diào)用線程產(chǎn)生執(zhí)行到另一個(gè)準(zhǔn)備在當(dāng)前處理器上運(yùn)行的線程。 操作系統(tǒng)選擇要產(chǎn)生的線程。

示例

以下示例說(shuō)明了Thread類(lèi)的用法。該頁(yè)面具有用于顯示來(lái)自子線程的消息的標(biāo)簽控件。 來(lái)自主程序的消息直接使用Response.Write()方法顯示。 因此,它們出現(xiàn)在頁(yè)面的頂部。

首先打開(kāi)Visual Studio,創(chuàng)建一個(gè)名稱(chēng)為:MultiThreadingASP.Net空網(wǎng)站 項(xiàng)目。并添加一個(gè)Web窗體文件 - Default.aspx

源文件(Default.aspx)如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>ASP.Net多線程示例</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <h3>ASP.Net多線程示例</h3>
         </div>

         <asp:Label ID="lblmessage" runat="server" Text="Label">
         </asp:Label>
    </form>
</body>
</html>

后端代碼文件(Default.aspx.cs)如下:

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;

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";
        }
    }
}

請(qǐng)注意以下幾點(diǎn)

  • 加載頁(yè)面時(shí),將使用childthreadcall()方法來(lái)啟動(dòng)一個(gè)新線程。主線程活動(dòng)直接顯示在網(wǎng)頁(yè)上。
  • 第二個(gè)線程運(yùn)行并將消息發(fā)送到標(biāo)簽控件。
  • 主線程休眠2000毫秒,在此期間子線程執(zhí)行。
  • 子線程一直運(yùn)行到主線程中止。它引發(fā)ThreadAbortException異常并終止。
  • 控制權(quán)返回到主線程。

運(yùn)行項(xiàng)目程序后,得到以下結(jié)果 -