日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
實例講解.NET多線程執(zhí)行函數(shù)

這里為什么會出現(xiàn)多線程?原因是DebugLZQ在寫一個LINQ綜合Demo的時候遇到了多線程,便停下手來整理一下。關于多線程的文章,園子里很多很多,因此關于多線程理論性的東西,LZ就不去多說了,這篇博文主要是用最簡單的例子,總結(jié)下多線程調(diào)用函數(shù)的相關注意點,重點偏向應用和記憶。

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設、高性價比永定網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式永定網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設找我們,業(yè)務覆蓋永定地區(qū)。費用合理售后完善,10年實體公司更值得信賴。

1.多線程調(diào)用無參函數(shù)                                                                                   

 
 
 
 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.Threading; 
  6.  
  7. namespace 多線程 
  8.     class Program 
  9.     { 
  10.         static void Main(string[] args) 
  11.         { 
  12.             Console.WriteLine("主線程開始"); 
  13.             Thread t = new Thread(new ThreadStart(ShowTime));//注意ThreadStart委托的定義形式 
  14.             t.Start();//線程開始,控制權(quán)返回Main線程 
  15.             Console.WriteLine("主線程繼續(xù)執(zhí)行"); 
  16.             //while (t.IsAlive == true) ; 
  17.             Thread.Sleep(1000); 
  18.             t.Abort(); 
  19.             t.Join();//阻塞Main線程,直到t終止 
  20.             Console.WriteLine("--------------"); 
  21.             Console.ReadKey(); 
  22.         } 
  23.         static void ShowTime() 
  24.         { 
  25.             while (true) 
  26.             { 
  27.                 Console.WriteLine(DateTime.Now.ToString());                
  28.             } 
  29.         } 
  30.     } 

注意ThreadStart委托的定義如下:

可見其對傳遞進來的函數(shù)要求是:返回值void,無參數(shù)。

2.多線程調(diào)用帶參函數(shù)(兩種方法)     

 
 
 
 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.Threading; 
  6.  
  7. namespace 多線程2_帶參數(shù) 
  8.     class Program 
  9.     { 
  10.         static void Main(string[] args) 
  11.         { 
  12.             Console.WriteLine("Main線程開始"); 
  13.             Thread t = new Thread(new ParameterizedThreadStart(DoSomething));//注意ParameterizedThreadStart委托的定義形式 
  14.             t.Start(new string[]{"Hello","World"}); 
  15.             Console.WriteLine("Main線程繼續(xù)執(zhí)行"); 
  16.  
  17.             Thread.Sleep(1000); 
  18.             t.Abort(); 
  19.             t.Join();//阻塞Main線程,直到t終止 
  20.             Console.ReadKey(); 
  21.         } 
  22.         static void DoSomething(object  s) 
  23.         { 
  24.             string[] strs = s as string[]; 
  25.             while (true) 
  26.             { 
  27.                 Console.WriteLine("{0}--{1}",strs[0],strs[1]); 
  28.             } 
  29.         } 
  30.     } 

注意ParameterizedThreadStart委托的定義如下:

可見其對傳入函數(shù)的要求是:返回值void,參數(shù)個數(shù)1,參數(shù)類型object

 
 
 
 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.Threading; 
  6.  
  7. namespace 多線程2_帶參數(shù)2 
  8. {    
  9.     class Program 
  10.     { 
  11.         static void Main(string[] args) 
  12.         { 
  13.             Guest guest = new Guest()  
  14.             { 
  15.              Name="Hello", Age=99 
  16.             }; 
  17.             Thread t = new Thread(new ThreadStart(guest.DoSomething));//注意ThreadStart委托的定義形式 
  18.             t.Start(); 
  19.  
  20.             Thread.Sleep(1000); 
  21.             t.Abort(); 
  22.             t.Join();//阻塞Main線程,直到t終止 
  23.             Console.ReadKey(); 
  24.         } 
  25.     } 
  26.     // 
  27.     class Guest 
  28.     { 
  29.         public string Name { get; set; } 
  30.         public int Age { get; set; } 
  31.  
  32.         public void DoSomething() 
  33.         { 
  34.             while (true) 
  35.             { 
  36.                 Console.WriteLine("{0}--{1}", Name, Age); 
  37.             } 
  38.         } 
  39.     } 

這個還是使用ThreadStart委托,對方法進行了一個封裝。

兩種方法,可隨意選擇,***種貌似簡潔一點。

3.線程同步

線程同步的方法有很多很多種volatile、Lock、InterLock、Monitor、Mutex、ReadWriteLock...

這里用lock說明問題:在哪里同步,用什么同步,同步誰?

首先感受下不同步會出現(xiàn)的問題:

代碼就是下面的代碼去掉lock塊。

 
 
 
 
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.Threading; 
  6.  
  7. namespace 多線程3_同步2 
  8.     class Program 
  9.     { 
  10.         static object obj = new object();//同步用 
  11.  
  12.         static int balance = 500; 
  13.  
  14.         static void Main(string[] args) 
  15.         { 
  16.             Thread t1 = new Thread(new ThreadStart(Credit)); 
  17.             t1.Start(); 
  18.  
  19.             Thread t2 = new Thread(new ThreadStart(Debit)); 
  20.             t2.Start(); 
  21.  
  22.             Console.ReadKey(); 
  23.         } 
  24.  
  25.         static void Credit() 
  26.         { 
  27.             for (int i = 0; i < 15; i++) 
  28.             { 
  29.                 lock (obj) 
  30.                 { 
  31.                     balance += 100; 
  32.                     Console.WriteLine("After crediting,balance is {0}", balance); 
  33.                 } 
  34.             } 
  35.         } 
  36.         static void Debit() 
  37.         { 
  38.             for (int i = 0; i < 15; i++) 
  39.             { 
  40.                 lock (obj) 
  41.                 { 
  42.                     balance -= 100; 
  43.                     Console.WriteLine("After debiting,balance is {0}", balance); 
  44.                 } 
  45.             } 
  46.         } 
  47.     } 

小結(jié):多線程調(diào)用函數(shù)就是這樣。在Winform中,控件綁定到特定的線程,從另一個線程更新控件,不應該直接調(diào)用該控件的成員,這個非常有用。

原文鏈接:http://www.cnblogs.com/DebugLZQ/archive/2012/11/11/2765487.html


網(wǎng)站名稱:實例講解.NET多線程執(zhí)行函數(shù)
文章轉(zhuǎn)載:http://www.dlmjj.cn/article/dhijegd.html