當(dāng)前位置:
首頁 >
C#中多线程 委托的使用
發(fā)布時間:2025/7/14
50
豆豆
生活随笔
收集整理的這篇文章主要介紹了
C#中多线程 委托的使用
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
背景:? 什么是多線程?我們在建立以個C#項目時,往往會在Form1上添加控件,然后寫代碼,初 學(xué)者都是在重復(fù)這個過程,其實這個過程是單線程的,可以理解為只有“main”主線程,有 的時候往往需要同時測量多個東西,比如說在掃面局域網(wǎng)主機(jī)時,如果按一個一個主機(jī)的IP 去掃描,會很浪費時間,因為當(dāng)一個主機(jī)未開機(jī),會對這個主機(jī)等待一直到超時。如果建立 多個線程,讓所有的IP 掃描分配給不同的線程去執(zhí)行,因此會節(jié)省很多時間,尤其是掃面 的IP段主機(jī)大部分沒開機(jī),和單線程比花費的時間差很多。? ? ? 因為我也是初學(xué)者,談的很膚淺,關(guān)于進(jìn)程、線程的概念還是去看高手的理解吧。不過有一 點,多線程未必會比單線程節(jié)省時間,上面的例子是節(jié)省時間的例子之一,但并不是說所有 多線程的程序比單線程程序節(jié)省時間。這要分情況看。? ? 下面說一下怎么使用多線程。(將在后面附有例子)? 第一步:在主程序前加上using system.threading? 第二部:線程實例化,一般是在主程序最前端聲明thread ? ?thread1;? 第三部:在調(diào)用線程的方法中給線程分配內(nèi)存,準(zhǔn)備啟動線程 ?thread1= ?new ?thread(方法 名)方法名指的是線程的入口,即要執(zhí)行的方法。然后啟動線程:thread1.start();? 第四步:終止線程? 終止線程有兩種方法,一種是使用建立公共布爾類型,在線程內(nèi)部時刻檢查布爾值,通過在 外界改變布爾類型的值,來控制線程的結(jié)束。? 第二種是強(qiáng)制退出線程,即調(diào)用thread1..abort();與此方法連用的是thread1.join();為什么要 連用呢?因為雖然線程強(qiáng)制退出,但是并不知道線程終止的具體時間,所以把強(qiáng)制退出的線 程合并到主線程中來。值得注意的是線程強(qiáng)制退出后不能夠用thread1.Resume()重啟線程。 所以強(qiáng)制線程退出的方法慎用。? ? 什么是委托呢?舉一個最實用的例子,剛才是不是已經(jīng)知道建立多線程了,但是自己建立的 線程時不能訪問其他線程的東西,比如說自己建立的線程是不能訪問窗體上的任何控件,但 是自己建立的線程很想用到窗體中的控件怎么呢?那就用委托吧。委托時系統(tǒng)專門用作協(xié)調(diào) 線程之間的關(guān)系的。? 委托的定義? Delegate ?(返回值類型)delegatename(委托名稱)(參數(shù)列表)? 例子:delegate void list();? ? ? Delegate string name(string s);? 委托實例化? list list1;? list1=new list(方法名);? ? 調(diào)用委托? 此時委托l(wèi)ist1 將作為調(diào)用委托的方法的一個參數(shù)。如listBox1.Invoke(list1);? 下面是一個涉及線程和委托綜合的小例子。
using System;?
using System.ComponentModel;?
using System.Drawing;?
using System.Text;?
using System.Windows.Forms;?
using System.Threading;//使用多線程的聲明(準(zhǔn)確的說是要在main主線程中建立新的線程時要進(jìn)行的引
? ? public partial class Form1 : Form?
? ? ? ? public static int Num = 0;?
? ? ? ? Thread thread1; //在主線程中聲明線程1?
? ? ? ? Thread thread2; //在主線程中聲明線程2?
? ? ? ? daililist list1;//委托實例化,即建立委托對應(yīng)的事件?
? ? ? ? ? ? InitializeComponent();?
? ? ? ? ? ? list1 = new daililist(updatelist);//委托處理的方法,這里updatelist是一個方法,這個句子的意思是把updatelist這個方法交給了list1這個委托實例?
? ? ? ? ? ? thread1 = new Thread(numadd );?
? ? ? ? ? ? thread1.Start();?
? ? ? ? ? ? thread2.Start();?
? ? ? ? public void updatelist()?
? ? ? ? ? ? listBox1.Items.Add (Num) ;?
? ? ? ? public void numadd()?
? ? ? ? ? ? Num ++;?
listBox1.Invoke(list1);//這是自己建立的線程要調(diào)用的方法,但是listbox1是main主線程建立的控件,自定義的線程無法直接訪問,上面已經(jīng)定義了委托,此處應(yīng)用listbox1的invoke?
//到此我們理一下思路,建立線程thread1、thread2,這兩個線程都指向了numadd這個方法,首先都執(zhí)行Num++,然后執(zhí)行l(wèi)istBox1.Invoke(list1),意思是說將要對listbox1操作,?
? ? ? ? private void button2_Click(object sender, EventArgs e)?
? ? ? ? ? ? thread1.Join();?
? ? ? ? ? ? thread2.Abort();?
? ? ? ? }?
? ? }?
}
using System.Collections.Generic; using System.Data; using System.Linq; 用說明) namespace mytest { { delegate void daililist();//主線程之外的線程要調(diào)用main線程中建立的控件,需要使用委托的方式,此處是委托的定義 public Form1() { } private void button1_Click(object sender, EventArgs e) { thread2 = new Thread(numadd); } { } { //方法把所有對listbox1的操作都交給委托l(wèi)ist1去處理。 //但是具體操作在list1這個委托當(dāng)中,然后這個委托指向了updatelist并執(zhí)行,至此thread1、thread2都完成了對listbox1的操作! } { thread1.Abort(); thread2.Join();
using System;?
using System.ComponentModel;?
using System.Drawing;?
using System.Text;?
using System.Windows.Forms;?
using System.Threading;//使用多線程的聲明(準(zhǔn)確的說是要在main主線程中建立新的線程時要進(jìn)行的引
? ? public partial class Form1 : Form?
? ? ? ? public static int Num = 0;?
? ? ? ? Thread thread1; //在主線程中聲明線程1?
? ? ? ? Thread thread2; //在主線程中聲明線程2?
? ? ? ? daililist list1;//委托實例化,即建立委托對應(yīng)的事件?
? ? ? ? ? ? InitializeComponent();?
? ? ? ? ? ? list1 = new daililist(updatelist);//委托處理的方法,這里updatelist是一個方法,這個句子的意思是把updatelist這個方法交給了list1這個委托實例?
? ? ? ? ? ? thread1 = new Thread(numadd );?
? ? ? ? ? ? thread1.Start();?
? ? ? ? ? ? thread2.Start();?
? ? ? ? public void updatelist()?
? ? ? ? ? ? listBox1.Items.Add (Num) ;?
? ? ? ? public void numadd()?
? ? ? ? ? ? Num ++;?
listBox1.Invoke(list1);//這是自己建立的線程要調(diào)用的方法,但是listbox1是main主線程建立的控件,自定義的線程無法直接訪問,上面已經(jīng)定義了委托,此處應(yīng)用listbox1的invoke?
//到此我們理一下思路,建立線程thread1、thread2,這兩個線程都指向了numadd這個方法,首先都執(zhí)行Num++,然后執(zhí)行l(wèi)istBox1.Invoke(list1),意思是說將要對listbox1操作,?
? ? ? ? private void button2_Click(object sender, EventArgs e)?
? ? ? ? ? ? thread1.Join();?
? ? ? ? ? ? thread2.Abort();?
? ? ? ? }?
? ? }?
}
using System.Collections.Generic; using System.Data; using System.Linq; 用說明) namespace mytest { { delegate void daililist();//主線程之外的線程要調(diào)用main線程中建立的控件,需要使用委托的方式,此處是委托的定義 public Form1() { } private void button1_Click(object sender, EventArgs e) { thread2 = new Thread(numadd); } { } { //方法把所有對listbox1的操作都交給委托l(wèi)ist1去處理。 //但是具體操作在list1這個委托當(dāng)中,然后這個委托指向了updatelist并執(zhí)行,至此thread1、thread2都完成了對listbox1的操作! } { thread1.Abort(); thread2.Join();
轉(zhuǎn)載于:https://www.cnblogs.com/suncoolcat/p/3292309.html
總結(jié)
以上是生活随笔為你收集整理的C#中多线程 委托的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 塔式、机架式、刀片式服务器的区别和特点
- 下一篇: C# 调用ArcGIS server a