首先,上個(gè)多線程的概念。通過單獨(dú)的線程來執(zhí)行某個(gè)任務(wù),一個(gè)多線程程序可以執(zhí)行多個(gè)任務(wù),而且這些線程都是并行執(zhí)行,同時(shí)執(zhí)行多個(gè)線程的能力稱為多線程。
做網(wǎng)站、成都做網(wǎng)站的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給創(chuàng)新互聯(lián)一個(gè)展示的機(jī)會(huì)來證明自己,這并不會(huì)花費(fèi)您太多時(shí)間,或許會(huì)給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗(yàn),一切以用戶為中心。
根據(jù)多線程的概念,我們知道,多線程可以提高程序的運(yùn)行效率,加快運(yùn)行的速度。比較典型的應(yīng)用就是我們經(jīng)常使用的下載工具,就用到了多線程技術(shù)。
在C#里面,.net framework為我們提供了多線程的實(shí)現(xiàn)。微軟的msdn文檔,也給出了實(shí)例。見 MSDN Thread類說明
下面上一段代碼,看一下C#中如何實(shí)現(xiàn)多線程。
我們?cè)诳刂婆_(tái)項(xiàng)目中,鍵入如下代碼:
Main函數(shù)中定義了3個(gè)線程的線程數(shù)組,然后循環(huán)調(diào)用。
static void Main(string[] args) { TestThread testThread = new TestThread(); Thread[] test = new Thread[] { new Thread(new ThreadStart(testThread.ActionMethod)), new Thread(new ThreadStart(testThread.ActionMethod)), new Thread(new ThreadStart(testThread.ActionMethod)) }; for (int i = 0; i < test.Length; i++) { test[i].Name = "子線程" + i; test[i].Start(); } }
這是一個(gè)普通的方法,用于測(cè)試線程的執(zhí)行情況。
public class TestThread { public void ActionMethod() { //lock (this) { for (int i = 0; i < 5; i++) { Console.WriteLine("線程名:" + Thread.CurrentThread.Name); } } } }
我們發(fā)現(xiàn)在ActionMethod方法中,lock(this)這一行被注釋掉了。
我們看一下運(yùn)行狀況。
這是沒加lock(this)的運(yùn)行情況 這是加了lock(this)的運(yùn)行情況
很顯然,lock將每一個(gè)線程對(duì)象鎖住,直到該對(duì)象釋放為止。我們看看官方的解釋:lock 確保當(dāng)一個(gè)線程位于代碼的臨界區(qū)時(shí),另一個(gè)線程不進(jìn)入臨界區(qū)。如果其他線程試圖進(jìn)入鎖定的代碼,則它將一直等待(即被阻止),直到該對(duì)象被釋放。見 msdn lock
這就引出了一個(gè)線程同步的概念。也就是說,我們?cè)诔绦蛑邢朕k法,對(duì)多個(gè)線程的執(zhí)行進(jìn)行協(xié)調(diào),使線程按照順序來執(zhí)行。線程同步的意思并不是說多個(gè)線程保持同樣的次序輸出,而是說單獨(dú)的線程執(zhí)行不被其他線程所干擾,要執(zhí)行下一個(gè)線程必須等待該線程結(jié)束才能進(jìn)行。這樣才能保證多個(gè)線程輸出的一致和同步。
說到這里,我想有人想問,多個(gè)線程同時(shí)執(zhí)行,我怎么去對(duì)他們執(zhí)行的優(yōu)先級(jí)進(jìn)行控制呢?比如,我想讓線程1的活先干完,然后讓線程2的活干完,最后是線程3的活干完。
這是很自然的需求,C#很方便的進(jìn)行了實(shí)現(xiàn)。
還是利用上面的代碼,在線程執(zhí)行之前,我們加下面這3行代碼。
test[0].Priority = ThreadPriority.Highest;//優(yōu)先級(jí)最高 test[1].Priority = ThreadPriority.Lowest;//優(yōu)先級(jí)最低 test[2].Priority = ThreadPriority.Normal;//優(yōu)先級(jí)正常
關(guān)于優(yōu)先級(jí)枚舉,可參見msdn ThreadPriority
最后,我們將做一個(gè)累加器,用多線程來實(shí)現(xiàn)。
首先我們畫一個(gè)winform界面
然后我們?cè)匍_始計(jì)算按鈕下面輸入如下代碼(這里的控件名沒改,讀者自行修改):
this.textBox4.Text = "0"; listBox1.Items.Clear(); int threadNumber = Convert.ToInt32(this.textBox3.Text); for (int i = 1; i <= threadNumber; i++) { ThreadStart threadStart = new ThreadStart(Add); Thread thread = new Thread(threadStart); thread.Name = i.ToString(); thread.Start(); }
private void Add() { DateTime beginTime = DateTime.Now; long minValue = long.Parse(textBox1.Text); long maxValue = long.Parse(textBox2.Text); int threadNumber = Convert.ToInt32(textBox3.Text); int threadOrder = Convert.ToInt32(Thread.CurrentThread.Name); long step = (maxValue - minValue + 1) / threadNumber; long beginValue = minValue + step * (threadOrder - 1); long endValue = beginValue + step; long result = 0; for (long i = beginValue; i < endValue; i++) { result += i; } lock (this) { long sum = long.Parse(textBox4.Text); sum += result; textBox4.Text = sum.ToString(); } DateTime endTime = DateTime.Now; TimeSpan timeSpan = endTime - beginTime; string message = "線程" + Thread.CurrentThread.Name + ":" + beginValue.ToString() + "到" + endValue.ToString() + ", 耗時(shí):" + timeSpan.TotalMilliseconds.ToString() + "毫秒"; this.listBox1.Items.Add(message); Thread.CurrentThread.Abort(); }
Add方法是一個(gè)核心方法,將需要計(jì)算的范圍按照線程數(shù)進(jìn)行分割,這樣讓每個(gè)線程獨(dú)自的完成自己的任務(wù),而不是一個(gè)線程從頭跑到尾。OK,我們查看一下運(yùn)行效果圖:
這里可以看到每個(gè)線程的運(yùn)行情況和執(zhí)行情況。
文章標(biāo)題:C#多線程的實(shí)現(xiàn)
標(biāo)題路徑:http://m.rwnh.cn/article16/ipjigg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、網(wǎng)頁設(shè)計(jì)公司、Google、App設(shè)計(jì)、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)