程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> C#多線程學習

C#多線程學習

編輯:C#基礎知識

一、談進程和線程。

進程:當一個程序被打開運行時,此刻它就是一個進程。它是操作系統進行資源調度和分配的基本單位,一個進程可以有若干個線程,線程也可以同時幫進程做多個事情

線程:線程程序執行流的最小單位,自己不擁有資源,但是他可以與同進程中的其他線程共享進程中所有的資源,一個線程可以創建或者終止其他的線程

多線程:在單CPU系統的單位時間內,CPU只能允許單個線程,順序取決於線程的級別{從低到高:Lowest、BelowNormal、Normal(默認)、AboveBoral、Highest},只因為相互切換頻密且時間非常短暫,所以說為多線程可以視為同時運行。

二、用Thread類創建線程

1、幾個經常用到屬性:

IsAlive:bool類型,用於判斷線程是否被執行,創建線程後不執行該值為False,調用Start()方法運行線程後該值為True,當線程結束後該值為False,其余ThreadState狀態都為True

IsBackground:是否為前台線程,用Thread類創建線程(Thread thread=new Thread())默認為前台線程,即IsBackground=False,CLR線程池所建立的線程總是默認為後台線程。當主程序關閉時前台線程不會隨主程序的關閉而關閉

ManagedThreadId:獲取線程唯一標識符

Name:線程名字

Priority:線程有限級別

ThreadState:線程狀態{unstarted、Running、WaitSleepJoin等等}

2、熟悉兩個委托:public delagate void ThreadStart()、public delegate void ParameterizedThreadStart(object a)

通過以上應該很清楚的看到這兩個委托的使用方法。

3、線程中的一些方法:

Sleep:把正在運行的線程掛起一段時間

Abort:終止本線程

Join:阻塞調用線程,只當這個線程完成後則繼續之後的操作或線程

Interrupt:中斷處於WautSleepJoin狀態的線程

Start:執行本線程

Suppend表示掛起,Resume表示恢復掛起的線程(已不能用,這裡不做解釋)

三、線程池

ThreadPool線程池中包含了QueueUserWorkItem這個方法用來進行異步調用,可以帶Object

的參數,也可以不帶,不帶參數默認為NULL

ThreadPool.SetMaxThreads()用於設置線程池最大線程數量,有兩個參數,第一個設置工作者線程,第一個用於設置IO線程

ThreadPool.QueueUserWorkItem(new WaitCallBack(方法名稱),參數)

上面這一步就已經在線程池中創建了一個線程,WaitCallBack同樣是一個委托: public delegate void WaitCallback(object state);

通過QueueUserWorkItem的方式來啟動線程比較簡單,但是不滿足我們在實際開發中的需要,它只能最多帶一個參數,而且無返回值。

四、使用委托類來開始一個線程

1、委托類幾個重要的方法:

Invoke();調用Invoke()方法時,對應此委托的所有方法都會被執行

BeginInvoke(),EndInvoke()支持委托的異步調用,由BeginInvoke啟動的線程都屬於線程池中的線程‘

2、BeginInvoke參數說明:

倒數第一個參數用於調用外部的數據,相當於網回調函數中傳遞參數

倒數第二個參數是回調函數

前面參數為匹配委托的方法中的參數

public delegate string GetString(string a)//聲明一個委托

static void Main(string[] arg)

{

GetString getstring=new GetString(GetName);//建立一個委托,並為他綁定一個方法

//異步調用委托需要用到IAsyncResult這一個接口

【//這種方式異步調用需要等到異步調用的方法執行完畢後才會調用主線程,不符合實際開發需要

IAsyncResult Result=getstring.BeginInvoke("張三",null,null);

string name=getstring.EndInvoke(Result);//獲取方法GetName返回來的值

Console.WriteLine(name);

Console.WriteLine("主線程");

}

 

【//通過IAsyncResult中的成員IsCompleted來獲取異步操作是否完成,bool類型,當異步調用操作未完成也會繼續執行主線程

IAsyncResult Result=getstring.BeginInvoke("張三",null,null);

while(!Result.IsCompleted)

{

Console.WriteLine("主線程");

}

string name=getstring.EndInvoke(Result);//獲取方法GetName返回來的值

Console.WriteLine(name);

 

【//使用WailHandle中的WaitOne()這個方法完成異步調用

IAsyncResult Result=getstring.BeginInvoke("張三",null,null);

while(!Result.AsyncWaitHandle.WaitOne(200))//參數代表時間,以一種輪詢的方式去判斷異步調用是否完成

{

Console.WriteLine("主線程");

}

string name=getstring.EndInvoke(Result);//獲取方法GetName返回來的值

Console.WriteLine(name);

【//如果需要監視多個異步調用是否完成,這個時候我們需要聲明一盒WaitHandle的數組,將需要監視的對象傳進去

IAsyncResult Result=getstring.BeginInvoke("張三",null,null);

Waithandle[] waitlist=new Waithandle[]{Result.AsyncWaitHandle,.....};

//主要有兩個方法進行監視 1、WaitAll(數組,時間),等待所有異步調用完成後返回一個bool值,2、WaitAny

等待waitlist其中一個完成異步調用後即返回一個int類型的值,該值就是數組的索引

while(!WaitHandle.WaitAll(waitlist,200))

{

Console.WriteLine("主線程");

}

 

pubslic string GetName(string name)

{

return "Hi"+name;

}

 

 

 

 

 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved