.NET Windows 多線程thread編程
更新時間:2012年12月15日 15:19:57 作者:
.net里使用線程,用thread類,定義線程,啟動,銷毀,全部包括在這個類里,定義一個線程,必須指定這個線程的函數(shù),也就是這個線程是做什么的
進程:工廠搬磚頭,10個工人搬完1000個磚頭
線程:每個工人,搬完100個磚頭,就是一個任務(wù)
采用線程,異步搬:
手工去搬,10個工人同時搬,效率高,異步執(zhí)行,如果不采用線程,等第一個人搬完后第二個人才搬,那就慢了
什么時候不能用線程:
如果要用小車來搬,只有一個小車,那么,在這樣的情況下,就不應(yīng)該用線程,因為只有一個小車,各個線程都在爭奪和等待這個小車,所以不能用線程。如果這個時候還要用線程,則導(dǎo)致資源浪費,
因為每個線程都有自己的資源,如包工頭(CPU)同一時間要管理這10個工人,而只有一個工人實際在做事。
線程的銷毀:在銷毀的時候需要考慮一些問題,比如搬磚頭時,你不可能在一個工人搬到一半的時候,你將他銷毀,那磚頭往哪放呢?
1..net里使用線程
.net里使用線程,用thread類,定義線程,啟動,銷毀,全部包括在這個類里定義一個線程,必須指定這個線程的函數(shù),也就是這個線程是做什么的,搬磚頭呢還是挑水
EG:
Thread t = new Thread( new ThreadStart( st.WorkerMethod ) );
t.Start ();
public void WorkerMethod()
{
Console.WriteLine ("AA ");
}
2.如果使用帶有參數(shù)的線程
線程本身是不能帶參數(shù)的,只能在類里定義一個全局變量,線程前先給這個變量賦值,然后在線程的函數(shù)里,去使用這個變量,以達到傳參數(shù)的目的
EG:
public class SimpleThread
{
private string procParameter = "";
public SimpleThread (string strPara)
{
procParameter = strPara;
}
public void WorkerMethod()
{
Console.WriteLine ("參數(shù)輸入為: " + procParameter);
}
}
class MainClass
{
/// <summary>
/// 應(yīng)用程序的主入口點。
/// </summary>
[STAThread]
static void Main(string[] args)
{
SimpleThread st = new SimpleThread("這是參數(shù)字符串!");
Thread t = new Thread( new ThreadStart( st.WorkerMethod ) );
t.Start ();
t.Join (Timeout.Infinite);
}
}
3.線程和委托
委托的目的:類似C++的指鐘,就是要把函數(shù)當做參數(shù)來傳遞
4.應(yīng)用程序域
10個工人各自搬各自的,隔離開,不相互受影響,一個人抱怨不搬了,不影響其他人,電腦里也是一樣的情況,各個應(yīng)用程序間不能干擾,程序間不能訪問,并且一個程序死了,整個電腦部能死機。
5.線程池
就如內(nèi)存,如果工人搬磚頭,突然有2個工人因為什么原因不能搬了,那么從線程池里調(diào)用其他線程來做,性能好,創(chuàng)建一個線程需要浪費時間和資源
6.異步調(diào)用
調(diào)用WebService為例
同步:調(diào)用一個WebService時,調(diào)用完了,才執(zhí)行下面的代碼,如果在調(diào)用的時候,阻塞了,那么就要等待很久
異步調(diào)用:調(diào)用WebService,代碼繼續(xù)往下執(zhí)行,WebService執(zhí)行完了后,再傳回到接收器對象。
7.多線程的應(yīng)用,利用線程排序
排序1000個數(shù),如果一個線程排,需要1000毫秒
如果10個線程排,則只需要大概100毫秒
當然,排序的時候a[i] a[i+1],同時只能有一個線程對他進行操作
所以,在For里面,i和i+1交換的時候,需要事先進行鎖定。
for (int t = 0; t < x; t++)//X為線程數(shù)
{
Thread thread = new Thread(new ThreadStart(Sort));//Sort排序的方法
thread.Name = Convert.ToString(t);
thread.Start();
}
public void Sort()
{
try
{
while (true)
{
swaped = false;
for (int j = 0; j < valueArray.Length - 1; j++)
{
lock (typeof(Thread))//鎖定
{
if (valueArray[j] > valueArray[j + 1])
{
int T = valueArray[j];
valueArray[j] = valueArray[j + 1];
valueArray[j + 1] = T;
swaped = true;
}
}
}
Thread.Sleep(1);
if (!swaped) { break; }
}
Thread.CurrentThread.Abort();
}
catch (Exception ex)
{
if (Interlocked.Increment(ref threadCounter) == Convert.ToInt64(ddlThreadNum.SelectedItem.ToString().ToString().Trim()))
Display();
}
}
線程:每個工人,搬完100個磚頭,就是一個任務(wù)
采用線程,異步搬:
手工去搬,10個工人同時搬,效率高,異步執(zhí)行,如果不采用線程,等第一個人搬完后第二個人才搬,那就慢了
什么時候不能用線程:
如果要用小車來搬,只有一個小車,那么,在這樣的情況下,就不應(yīng)該用線程,因為只有一個小車,各個線程都在爭奪和等待這個小車,所以不能用線程。如果這個時候還要用線程,則導(dǎo)致資源浪費,
因為每個線程都有自己的資源,如包工頭(CPU)同一時間要管理這10個工人,而只有一個工人實際在做事。
線程的銷毀:在銷毀的時候需要考慮一些問題,比如搬磚頭時,你不可能在一個工人搬到一半的時候,你將他銷毀,那磚頭往哪放呢?
1..net里使用線程
.net里使用線程,用thread類,定義線程,啟動,銷毀,全部包括在這個類里定義一個線程,必須指定這個線程的函數(shù),也就是這個線程是做什么的,搬磚頭呢還是挑水
EG:
復(fù)制代碼 代碼如下:
Thread t = new Thread( new ThreadStart( st.WorkerMethod ) );
t.Start ();
public void WorkerMethod()
{
Console.WriteLine ("AA ");
}
2.如果使用帶有參數(shù)的線程
線程本身是不能帶參數(shù)的,只能在類里定義一個全局變量,線程前先給這個變量賦值,然后在線程的函數(shù)里,去使用這個變量,以達到傳參數(shù)的目的
EG:
復(fù)制代碼 代碼如下:
public class SimpleThread
{
private string procParameter = "";
public SimpleThread (string strPara)
{
procParameter = strPara;
}
public void WorkerMethod()
{
Console.WriteLine ("參數(shù)輸入為: " + procParameter);
}
}
class MainClass
{
/// <summary>
/// 應(yīng)用程序的主入口點。
/// </summary>
[STAThread]
static void Main(string[] args)
{
SimpleThread st = new SimpleThread("這是參數(shù)字符串!");
Thread t = new Thread( new ThreadStart( st.WorkerMethod ) );
t.Start ();
t.Join (Timeout.Infinite);
}
}
3.線程和委托
委托的目的:類似C++的指鐘,就是要把函數(shù)當做參數(shù)來傳遞
4.應(yīng)用程序域
10個工人各自搬各自的,隔離開,不相互受影響,一個人抱怨不搬了,不影響其他人,電腦里也是一樣的情況,各個應(yīng)用程序間不能干擾,程序間不能訪問,并且一個程序死了,整個電腦部能死機。
5.線程池
就如內(nèi)存,如果工人搬磚頭,突然有2個工人因為什么原因不能搬了,那么從線程池里調(diào)用其他線程來做,性能好,創(chuàng)建一個線程需要浪費時間和資源
6.異步調(diào)用
調(diào)用WebService為例
同步:調(diào)用一個WebService時,調(diào)用完了,才執(zhí)行下面的代碼,如果在調(diào)用的時候,阻塞了,那么就要等待很久
異步調(diào)用:調(diào)用WebService,代碼繼續(xù)往下執(zhí)行,WebService執(zhí)行完了后,再傳回到接收器對象。
7.多線程的應(yīng)用,利用線程排序
排序1000個數(shù),如果一個線程排,需要1000毫秒
如果10個線程排,則只需要大概100毫秒
當然,排序的時候a[i] a[i+1],同時只能有一個線程對他進行操作
所以,在For里面,i和i+1交換的時候,需要事先進行鎖定。
復(fù)制代碼 代碼如下:
for (int t = 0; t < x; t++)//X為線程數(shù)
{
Thread thread = new Thread(new ThreadStart(Sort));//Sort排序的方法
thread.Name = Convert.ToString(t);
thread.Start();
}
public void Sort()
{
try
{
while (true)
{
swaped = false;
for (int j = 0; j < valueArray.Length - 1; j++)
{
lock (typeof(Thread))//鎖定
{
if (valueArray[j] > valueArray[j + 1])
{
int T = valueArray[j];
valueArray[j] = valueArray[j + 1];
valueArray[j + 1] = T;
swaped = true;
}
}
}
Thread.Sleep(1);
if (!swaped) { break; }
}
Thread.CurrentThread.Abort();
}
catch (Exception ex)
{
if (Interlocked.Increment(ref threadCounter) == Convert.ToInt64(ddlThreadNum.SelectedItem.ToString().ToString().Trim()))
Display();
}
}
相關(guān)文章
C#后臺調(diào)用前臺javascript的五種方法小結(jié)
于項目需要,用到其他項目組用VC開發(fā)的組件,在web后臺代碼無法訪問這個組件,所以只好通過后臺調(diào)用前臺的javascript,從而操作這個組件。2010-12-12.NET必知的EventCounters性能指標監(jiān)視器詳解
這篇文章主要介紹了.NET必知的EventCounters性能指標監(jiān)視器,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11asp.net sqlconnection con.close和con.dispose區(qū)別
con.close是用來關(guān)閉和數(shù)據(jù)庫的連接,相對于open2008-12-12asp.net 數(shù)據(jù)訪問層 存儲過程分頁語句
在asp.net 網(wǎng)頁中如果在業(yè)務(wù)邏輯層分頁在使用PagedDataSource對象,但如果數(shù)據(jù)記錄過多,使用它會嚴重的損害應(yīng)用程序的性能.2009-12-12asp.net 保存、修改沒有 runat=server控件的控件值的一個解決方案
asp.net 保存、修改沒有 runat=server控件的控件值的一個解決方案,需要的朋友可以參考下。2011-10-10.Net中導(dǎo)出數(shù)據(jù)到Excel(asp.net和winform程序中)
.Net中導(dǎo)出數(shù)據(jù)到Excel包括以下兩種情況:asp.net中導(dǎo)出Excel的方法/winForm中導(dǎo)出Excel的方法,針對以上兩種情況做了下詳細的實現(xiàn)代碼,感興趣的朋友可不要錯過了哈,希望本文對你有所幫助2013-02-02使用DataTable.Select 方法時,特殊字符的轉(zhuǎn)義方法分享
常見的特殊字符 基本都能轉(zhuǎn)義 ,不知道還有沒有漏掉的 ,目前使用正常 ,有需要的朋友可以參考一下2013-10-10