.NET Windows 多線程thread編程_實用技巧

來源:互聯網
上載者:User
進程:工廠搬磚頭,10個工人搬完1000個磚頭
線程:每個工人,搬完100個磚頭,就是一個任務
採用線程,非同步搬:
手工去搬,10個工人同時搬,效率高,非同步執行,如果不採用線程,等第一個人搬完後第二個人才搬,那就慢了

什麼時候不能用線程
如果要用小車來搬,只有一個小車,那麼,在這樣的情況下,就不應該用線程,因為只有一個小車,各個線程都在爭奪和等待這個小車,所以不能用線程。如果這個時候還要用線程,則導致資源浪費,
因為每個線程都有自己的資源,如包工頭(CPU)同一時間要管理這10個工人,而只有一個工人實際在做事。
線程的銷毀:在銷毀的時候需要考慮一些問題,比如搬磚頭時,你不可能在一個工人搬到一半的時候,你將他銷毀,那磚頭往哪放呢?

1..net裡使用線程
.net裡使用線程,用thread類,定義線程,啟動,銷毀,全部包括在這個類裡定義一個線程,必須指定這個線程的函數,也就是這個線程是做什麼的,搬磚頭呢還是挑水
EG:
複製代碼 代碼如下:

Thread t = new Thread( new ThreadStart( st.WorkerMethod ) );
t.Start ();
public void WorkerMethod()
{
Console.WriteLine ("AA ");
}

2.如果使用帶有參數的線程
線程本身是不能帶參數的,只能在類裡定義一個全域變數,線程前先給這個變數賦值,然後線上程的函數裡,去使用這個變數,以達到傳參數的目的
EG:
複製代碼 代碼如下:

public class SimpleThread
{
private string procParameter = "";
public SimpleThread (string strPara)
{
procParameter = strPara;
}
public void WorkerMethod()
{
Console.WriteLine ("參數輸入為: " + procParameter);
}
}
class MainClass
{
/// <summary>
/// 應用程式的主進入點。
/// </summary>
[STAThread]
static void Main(string[] args)
{
SimpleThread st = new SimpleThread("這是參數字串!");
Thread t = new Thread( new ThreadStart( st.WorkerMethod ) );
t.Start ();
t.Join (Timeout.Infinite);
}
}

3.線程和委託
委託的目的:類似C++的指鐘,就是要把函數當做參數來傳遞
4.應用程式定義域
10個工人各自搬各自的,隔離開,不相互受影響,一個人抱怨不搬了,不影響其他人,電腦裡也是一樣的情況,各個應用程式間不能干擾,程式間不能訪問,並且一個程式死了,整個電腦部能死機。
5.線程池
就如記憶體,如果工人搬磚頭,突然有2個工人因為什麼原因不能搬了,那麼從線程池裡調用其他線程來做,效能好,建立一個線程需要浪費時間和資源
6.非同步呼叫
調用WebService為例
同步:調用一個WebService時,調用完了,才執行下面的代碼,如果在調用的時候,阻塞了,那麼就要等待很久
非同步呼叫:調用WebService,代碼繼續往下執行,WebService執行完了後,再傳回到接收器對象。
7.多線程的應用,利用線程排序
排序1000個數,如果一個線程排,需要1000毫秒
如果10個線程排,則只需要大概100毫秒
當然,排序的時候a[i] a[i+1],同時只能有一個線程對他進行操作
所以,在For裡面,i和i+1交換的時候,需要事先進行鎖定。
複製代碼 代碼如下:

for (int t = 0; t < x; t++)//X為線程數
{
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();
}
}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.