W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
一個(gè)線程被定義為一個(gè)程序的執(zhí)行路徑。每個(gè)線程都定義了一個(gè)獨(dú)特的流量控制。如果你的應(yīng)用程序涉及到復(fù)雜的和耗時(shí)的操作,如數(shù)據(jù)庫(kù)訪問(wèn)或一些激烈的 I/O 操作,那么往往設(shè)置不同的執(zhí)行路徑或線程,每個(gè)線程執(zhí)行一個(gè)特定的工作是非常有益的。
線程是輕量級(jí)的進(jìn)程。使用線程的一個(gè)常見(jiàn)的例子是現(xiàn)代操作系統(tǒng)并行編程的的實(shí)現(xiàn)。使用線程節(jié)省了 CPU 周期的損失,提高了應(yīng)用效率。
到目前為止我們編譯好的程序在一個(gè)線程作為一個(gè)單一的過(guò)程運(yùn)行,即是應(yīng)用程序的運(yùn)行實(shí)例。然而,這樣的應(yīng)用程序只可以在某一時(shí)刻執(zhí)行一個(gè)工作。讓它在同一時(shí)間執(zhí)行多個(gè)任務(wù),可以把它分成更小的線程。
在 .Net ,線程是通過(guò) ‘System.Threading’ 的命名空間處理的。創(chuàng)造的 system.threading.thread 類型的變量允許你創(chuàng)建一個(gè)新線程開(kāi)始工作。它允許你在一個(gè)單獨(dú)的線程創(chuàng)建和訪問(wèn)獨(dú)立的線程。
一個(gè)線程是由一個(gè)線程對(duì)象創(chuàng)建的,并給出了它的構(gòu)造函數(shù)的開(kāi)啟線程的參考。
ThreadStart childthreat = new ThreadStart(childthreadcall);
一個(gè)線程的生命周期開(kāi)始于 system.threading.thread 類的一個(gè)對(duì)象被創(chuàng)建,結(jié)束于線程被終止或執(zhí)行完成。
以下是在一個(gè)線程的生命周期的各種狀態(tài):
Thread 類中的優(yōu)先級(jí)屬性主要是相對(duì)于其他線程指定一個(gè)線程的優(yōu)先級(jí)。 .NET 運(yùn)行時(shí)選擇具有最高優(yōu)先級(jí)的就緒線程。優(yōu)先權(quán)可分為:
一旦一個(gè)線程被創(chuàng)建,系統(tǒng)就會(huì)使用 Thread 類的優(yōu)先級(jí)設(shè)置系統(tǒng)設(shè)定好它的優(yōu)先級(jí)。
NewThread.Priority = ThreadPriority.Highest;
線程類具有以下重要特性:
屬性 | 描述 |
---|---|
CurrentContext | 獲取當(dāng)前正在執(zhí)行的線程的內(nèi)容。 |
CurrentCulture | 獲取或設(shè)置當(dāng)前線程的環(huán)境。 |
CurrentPrinciple | 獲取或設(shè)置當(dāng)前進(jìn)程關(guān)于基于角色的安全機(jī)制的原則。 |
CurrentThread | 獲取當(dāng)前正在運(yùn)行的線程。 |
CurrentUICulture | 獲取或設(shè)置當(dāng)前運(yùn)行的進(jìn)程的資源管理器用于查找特定資源的當(dāng)前環(huán)境。 |
ExecutionContext | 獲取包含有關(guān)當(dāng)前線程的上下文信息的 ExecutionContext 對(duì)象。 |
IsAlive | 獲取一個(gè)值,指示當(dāng)前線程的執(zhí)行狀態(tài)。 |
IsBackground | 后臺(tái)獲取或設(shè)置一個(gè)值指示線程是否是后臺(tái)線程。 |
IsThreadPoolThread | 獲取一個(gè)值,指示線程是否屬于托管線程池。 |
ManagedThreadId | 獲取托管線程的當(dāng)前唯一標(biāo)識(shí)符。 |
Name | 獲取或設(shè)置線程的名稱。 |
Priority | 獲取或設(shè)置一個(gè)值,表示一個(gè)線程的調(diào)度優(yōu)先級(jí)。 |
ThreadState | 獲取一個(gè)值,包含當(dāng)前線程的狀態(tài)。 |
線程類具有以下重要方法:
方法 | 描述 |
---|---|
Abort | 調(diào)用一個(gè) ThreadAbortException 開(kāi)始終止線程的過(guò)程,調(diào)用此方法通常會(huì)終止線程。 |
AllocateDataSlot | 向所有線程分配一個(gè)未命名的數(shù)據(jù)槽。為了獲得更好的性能,使用標(biāo)有 ThreadStaticAttribute 屬性的域。 |
AllocateNamedDataSlot | 向所有線程上分配已命名的數(shù)據(jù)槽。為了獲得更好的性能,使用的是標(biāo)有 ThreadStaticAttribute 屬性的域。 |
BeginCriticalRegion | 通知宿主執(zhí)行即將進(jìn)入代碼區(qū)域,那里線程中止或未處理的異常的影響可能危及其他任務(wù)的應(yīng)用領(lǐng)域。 |
BeginThreadAffinity | 通知主機(jī)托管代碼將要執(zhí)行,取決于當(dāng)前的物理操作系統(tǒng)線程的標(biāo)識(shí)說(shuō)明。 |
EndCriticalRegion | 通知宿主執(zhí)行即將進(jìn)入代碼區(qū)域,那里線程中止或未處理的異常僅影響當(dāng)前任務(wù)。 |
EndThreadAffinity | 通知宿主托管代碼執(zhí)行完成,取決于當(dāng)前的物理操作系統(tǒng)線程的標(biāo)識(shí)說(shuō)明。 |
FreeNamedDataSlot | 為進(jìn)程中的所有線程消除名稱與槽之間的關(guān)聯(lián),為了獲得更好的性能,使用的是標(biāo)有 ThreadStaticAttribute 屬性的域。 |
GetData | 在當(dāng)前線程的當(dāng)前域從當(dāng)前線程指定的插槽檢索值。為了獲得更好的性能,使用的是標(biāo)有 ThreadStaticAttribute 屬性的域。 |
GetDomain | 返回當(dāng)前域中當(dāng)前正在執(zhí)行的線程。 |
GetDomainID | 返回唯一的應(yīng)用程序域標(biāo)識(shí)符。 |
GetNamedDataSlot | 查找已命名的數(shù)據(jù)槽。為了獲得更好的性能,使用的是標(biāo)有 ThreadStaticAttribute 屬性的域。 |
Interrupt | 中斷一個(gè)在 WaitSleepJoin 線程狀態(tài)的線程。 |
Join | 阻塞調(diào)用線程,直到某個(gè)線程終止,同時(shí)繼續(xù)執(zhí)行標(biāo)準(zhǔn)的 COM 和 SendMessage 。該方法具有不同的重載形式。 |
MemoryBarrier | 同步內(nèi)存訪問(wèn)如下:處理當(dāng)前線程的加速器不能以存儲(chǔ)器訪問(wèn)調(diào)用 MemoryBarrier 后先調(diào)用內(nèi)存訪問(wèn)執(zhí)行這種方式對(duì)指令重新排序。 |
ResetAbort | 取消當(dāng)前線程的中止請(qǐng)求。 |
SetData | 設(shè)置數(shù)據(jù)在指定的時(shí)隙上當(dāng)前運(yùn)行的線程,該線程的當(dāng)前域。為了獲得更好的性能,應(yīng)用領(lǐng)域有 ThreadStaticAttribute 屬性的域。 |
Start | 啟動(dòng)一個(gè)線程。 |
Sleep | 使線程暫停一個(gè)時(shí)間段。 |
SpinWait | 使線程等待的參數(shù)定義的迭代次數(shù)。 |
VolatileRead() | 讀取字段的值。最新的值是由計(jì)算機(jī)的任何處理器寫入,不論處理器或處理器緩存的狀態(tài)數(shù)。該方法具有不同的重載形式。 |
VolatileWrite() | 立即向字段寫入一個(gè)值,這樣的值是對(duì)計(jì)算機(jī)中的所有處理器可見(jiàn)。該方法具有不同的重載形式。 |
Yield | 使調(diào)用線程執(zhí)行可以在當(dāng)前的處理器運(yùn)行的另一個(gè)線程,操作系統(tǒng)選用轉(zhuǎn)向的縣城 |
下面的例子闡明了對(duì)線程類的使用。該頁(yè)面有一個(gè)控制標(biāo)簽顯示子線程傳來(lái)的消息。從主程序傳來(lái)的消息直接使用 response.write(50) 的方法顯示出來(lái),因此它們出現(xiàn)在頁(yè)面的頂部。
源文件如下:
<%@ 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>
后臺(tái)代碼如下:
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";
}
}
}
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: