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

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