成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C#多線程的實現(xiàn)

首先,上個多線程的概念。通過單獨的線程來執(zhí)行某個任務,一個多線程程序可以執(zhí)行多個任務,而且這些線程都是并行執(zhí)行,同時執(zhí)行多個線程的能力稱為多線程。

做網(wǎng)站、成都做網(wǎng)站的關注點不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給創(chuàng)新互聯(lián)一個展示的機會來證明自己,這并不會花費您太多時間,或許會給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗,一切以用戶為中心。

根據(jù)多線程的概念,我們知道,多線程可以提高程序的運行效率,加快運行的速度。比較典型的應用就是我們經(jīng)常使用的下載工具,就用到了多線程技術。

在C#里面,.net framework為我們提供了多線程的實現(xiàn)。微軟的msdn文檔,也給出了實例。見 MSDN Thread類說明

下面上一段代碼,看一下C#中如何實現(xiàn)多線程。

我們在控制臺項目中,鍵入如下代碼:

Main函數(shù)中定義了3個線程的線程數(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();
    }
}

這是一個普通的方法,用于測試線程的執(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)這一行被注釋掉了。

我們看一下運行狀況。

這是沒加lock(this)的運行情況                      這是加了lock(this)的運行情況

C# 多線程的實現(xiàn)C# 多線程的實現(xiàn)

很顯然,lock將每一個線程對象鎖住,直到該對象釋放為止。我們看看官方的解釋:lock 確保當一個線程位于代碼的臨界區(qū)時,另一個線程不進入臨界區(qū)。如果其他線程試圖進入鎖定的代碼,則它將一直等待(即被阻止),直到該對象被釋放。見 msdn lock

這就引出了一個線程同步的概念。也就是說,我們在程序中想辦法,對多個線程的執(zhí)行進行協(xié)調(diào),使線程按照順序來執(zhí)行。線程同步的意思并不是說多個線程保持同樣的次序輸出,而是說單獨的線程執(zhí)行不被其他線程所干擾,要執(zhí)行下一個線程必須等待該線程結束才能進行。這樣才能保證多個線程輸出的一致和同步。

說到這里,我想有人想問,多個線程同時執(zhí)行,我怎么去對他們執(zhí)行的優(yōu)先級進行控制呢?比如,我想讓線程1的活先干完,然后讓線程2的活干完,最后是線程3的活干完。

這是很自然的需求,C#很方便的進行了實現(xiàn)。

還是利用上面的代碼,在線程執(zhí)行之前,我們加下面這3行代碼。

test[0].Priority = ThreadPriority.Highest;//優(yōu)先級最高
test[1].Priority = ThreadPriority.Lowest;//優(yōu)先級最低
test[2].Priority = ThreadPriority.Normal;//優(yōu)先級正常

關于優(yōu)先級枚舉,可參見msdn ThreadPriority

最后,我們將做一個累加器,用多線程來實現(xiàn)。

首先我們畫一個winform界面

C# 多線程的實現(xiàn)

然后我們再開始計算按鈕下面輸入如下代碼(這里的控件名沒改,讀者自行修改):

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() + ", 耗時:" + timeSpan.TotalMilliseconds.ToString() + "毫秒";
    this.listBox1.Items.Add(message);
    Thread.CurrentThread.Abort();
}

Add方法是一個核心方法,將需要計算的范圍按照線程數(shù)進行分割,這樣讓每個線程獨自的完成自己的任務,而不是一個線程從頭跑到尾。OK,我們查看一下運行效果圖:

C# 多線程的實現(xiàn)
這里可以看到每個線程的運行情況和執(zhí)行情況。

文章標題:C#多線程的實現(xiàn)
標題路徑:http://jinyejixie.com/article16/ipjigg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信公眾號網(wǎng)頁設計公司、GoogleApp設計、品牌網(wǎng)站設計網(wǎng)站設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
昌图县| 万荣县| 黄大仙区| 方山县| 和田市| 三台县| 太谷县| 河北区| 岳普湖县| 方城县| 龙游县| 漳州市| 深州市| 秀山| 永福县| 长宁区| 富宁县| 阿尔山市| 城步| 孝义市| 十堰市| 乌什县| 巴彦县| 花垣县| 永寿县| 林西县| 天镇县| 咸阳市| 朝阳县| 海丰县| 乐至县| 乐昌市| 大冶市| 盖州市| 永安市| 霍邱县| 鞍山市| 阜新| 文昌市| 桑日县| 新邵县|