C#多線程隨記回顧
1.創(chuàng)建多線程方式知道的有三種:
?---手動(dòng)創(chuàng)建Thread、使用線程池、使用task任務(wù)
---手動(dòng)創(chuàng)建Thread,分兩種帶參數(shù)和不帶參數(shù)的幫助委托器
eg:? //幫助器委托不帶參數(shù)
??????? //??? ThreadStart ts = new ThreadStart(DoWork)
??????? //??? for (int i = 1; i <= 3; i++)
??????? //??? {
??????? //??????? Thread t = new Thread(ts);
??????? //??????? t.Name = "線程"+i.ToString() ;
??????? //??????? t.Start();
??????? //??? }
??????? //??? Console.Read();
? eg://幫助器委托帶參數(shù)
??????????? ParameterizedThreadStart ts = new ParameterizedThreadStart(DoWork);
??????????? for (int i = 1; i <= 3; i++)
??????????? {
??????????????? Thread t = new Thread(ts);
??????????????? t.Name = "線程" + i.ToString();
??????????????? t.Start(5);??????????? }
??????????? Console.Read();
-------回調(diào)方法:
//委托
f = new FDeletate(Fibonacci);
??????????? AsyncCallback callback = new AsyncCallback(Display);//回調(diào)委托
??????????? int n = Convert.ToInt32(Console.ReadLine());
??????????? f.BeginInvoke(n, callback,"ggds");
??????????? Console.ReadLine();
--回調(diào)方法; = f.EndInvoke(r);將結(jié)果返回
? static void Display(IAsyncResult r)
??????? {
??????????? int result = f.EndInvoke(r);
??????????? Console.WriteLine("第"+r.AsyncState+"項(xiàng)值是"+result);
??????????? Console.Read();
??????? }
-----------補(bǔ)充線程:
----線程是windows任務(wù)調(diào)度最小的單位,線程是程序的一個(gè)執(zhí)行流;
cpu切換的不是進(jìn)程而是線程。進(jìn)程占用資源太多;
--單核cpu一個(gè)時(shí)間只有一個(gè)線程;一個(gè)exe就是一個(gè)進(jìn)程;
一個(gè)線程對(duì)應(yīng)一個(gè)寄存器;
--Process.Start("");
---一個(gè)應(yīng)用程序與只能承載一個(gè)exe,可承載多個(gè)dll;
---一個(gè)進(jìn)程可以有多個(gè)應(yīng)用程序域;
--一個(gè)線程可穿透多個(gè)應(yīng)用程序與,
同一時(shí)間一個(gè)線程指正屬于一個(gè)應(yīng)用程序域;
一個(gè)應(yīng)用程序與可以跑多個(gè)線程;
==一個(gè)應(yīng)用程序與有一個(gè)上下文;
----當(dāng)前線程:
?Thread t = Thread.CurrentThread;
t.name;
-----
?? //后臺(tái)線程;
?? t.IsBackground = true;
--thrad線程是clr線程和操作系統(tǒng)線程是不一樣的;之間是映射關(guān)系;
線程終止:Thread.abort();
前臺(tái)線程和后臺(tái)線程。這兩者的區(qū)別就是:應(yīng)用程序必須運(yùn)行完所有的前臺(tái)線程才可以退出;而對(duì)于后臺(tái)線程,應(yīng)用程序則可以不考慮其是否已經(jīng)運(yùn)行完畢而直接退出,所有的后臺(tái)線程在應(yīng)用程序退出時(shí)都
---會(huì)自動(dòng)結(jié)束。
---默認(rèn)為前臺(tái)線程,thread.isbackground=false;
--線程優(yōu)先級(jí):AboveNormal;
?//默認(rèn)優(yōu)先級(jí):為AboveNormal;
??????????? Thread t = Thread.CurrentThread;
??????????? t.Priority = ThreadPriority.AboveNormal;
-----初始化一個(gè)線程:需要1M內(nèi)存;
委托穿多個(gè)參數(shù)時(shí),可以用list<object>
------windows窗體跨線程調(diào)用時(shí),控制不能跨線程需要設(shè)置:
Control.checkForIllegalcrossThreadcalls=false;不檢查,則能跨線程
-----lamed:
匿名函數(shù):Cal是委托;
Cal c = new Cal((a, b) => { return a + b; });
如果沒有參數(shù):
Cal c = new Cal(() => { return 123; });
Cal c = new Cal((a, b) => { return a + b; });
IAsyncResult result = c.BeginInvoke(1, 2, null, null);
//阻塞線程;
int cc = c.EndInvoke(result);
??????????????? Console.WriteLine(cc);
??????????? Console.Read();
----cc為返回結(jié)果;
------------------------------------第二種通過線程池來創(chuàng)建:
----------lock鎖:lock內(nèi)的變量是引用類型;操作公共資源時(shí)只讓一個(gè)線程來操作,進(jìn)行線程隔離和線程的同步(無論哪個(gè)線程訪問都是的結(jié)果,比如+1操作);比如一個(gè)數(shù)組,否則會(huì)出
?
現(xiàn)超出索引;
lock()--:其實(shí)內(nèi)部為monitor
{
?
}
---創(chuàng)建一個(gè)實(shí)例,會(huì)在一個(gè)應(yīng)用程序域創(chuàng)建(類空間、同步索引快(默認(rèn)為-1,類型指針(指向該實(shí)例的類型));
提到對(duì)象池,就應(yīng)該想到lock;
---以后調(diào)用線程的時(shí)候就用線程池;guo方法是object類型;這樣比穿件Thread簡(jiǎn)單多了;
?? //線程池:ThreadPool.QueueUserWorkItem(new WaitCallbac(guo), "");
---線程池原理,將任務(wù)加載到隊(duì)列排隊(duì),在進(jìn)入到本地隊(duì)列讓cpu執(zhí)行;
?? {
?? ThreadPool.QueueUserWorkItem(new WaitCallback(guo), "");
??????????? Console.Write("主線程");
??????????? Console.Read();
??????? }
??????? public static void guo(object i)
??????? {
??????????? Thread.Sleep(3000);
??????????? Console.WriteLine("sfsdf");
??????? }
---死鎖:相互等待對(duì)方釋放資源;
---委托如果是無參,有返回值,那么匿名函數(shù),應(yīng)該為 ()=>{};;
--------3.使用task任務(wù);
????????? Task<string> ta = new Task<string>(() => {
??????????????? System.Threading.Thread.Sleep(2000);
??????????????? Console.WriteLine("sfsf");
??????????????? return "";
??????????? });
??????????? ta.Start();
??????????? Console.Write("主線程");
??????????? Console.Read();
--
--task任務(wù),可以使用 ta.Wait();來阻塞主線程,讓子線程執(zhí)行完,在執(zhí)行;
--Thread t = new Thread(() => { });
? t.Join();//相當(dāng)于ta.Wait();
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
