自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實(shí)例講解.NET多線程執(zhí)行函數(shù)

開發(fā) 后端
這篇博文主要是用最簡(jiǎn)單的例子,總結(jié)下多線程調(diào)用函數(shù)的相關(guān)注意點(diǎn),重點(diǎn)偏向應(yīng)用和記憶。

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

1.多線程調(diào)用無(wú)參函數(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委托的定義如下:

可見其對(duì)傳遞進(jìn)來(lái)的函數(shù)要求是:返回值void,無(wú)參數(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委托的定義如下:

可見其對(duì)傳入函數(shù)的要求是:返回值void,參數(shù)個(gè)數(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 { getset; } 
  30.         public int Age { getset; } 
  31.  
  32.         public void DoSomething() 
  33.         { 
  34.             while (true
  35.             { 
  36.                 Console.WriteLine("{0}--{1}", Name, Age); 
  37.             } 
  38.         } 
  39.     } 
這個(gè)還是使用ThreadStart委托,對(duì)方法進(jìn)行了一個(gè)封裝。

兩種方法,可隨意選擇,***種貌似簡(jiǎn)潔一點(diǎn)。

3.線程同步

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

這里用lock說(shuō)明問題:在哪里同步,用什么同步,同步誰(shuí)?

首先感受下不同步會(huì)出現(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中,控件綁定到特定的線程,從另一個(gè)線程更新控件,不應(yīng)該直接調(diào)用該控件的成員,這個(gè)非常有用。

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

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2010-03-15 19:37:00

Java多線程同步

2009-10-27 12:20:06

VB.NET多線程應(yīng)用

2009-02-01 09:06:15

.NET多線程.NET線程管理

2009-10-09 17:01:32

VB.NET多線程

2010-04-27 17:23:34

AIX系統(tǒng)

2010-03-03 09:12:25

.NET字符串拘留池

2011-12-15 11:03:21

JavaNIO

2011-06-30 17:31:32

Qt 多線程 信號(hào)

2009-11-23 14:44:22

PHP 5.0構(gòu)造函數(shù)

2009-12-14 14:32:50

Ruby線程局部域變量

2009-07-21 17:09:47

ASP.NET多線程

2017-03-08 16:25:54

Linux多線程函數(shù)

2009-07-28 11:34:02

ASP.NET架設(shè)

2009-07-28 15:30:34

ASP.NET多線程

2009-10-22 11:25:08

CLR函數(shù)壓縮

2009-10-12 16:08:14

VB.NET訪問注冊(cè)表

2009-07-30 13:57:39

ASP.NET水晶報(bào)表ASP.NET

2010-01-14 16:54:56

VB.NET Impo

2010-01-18 18:06:07

VB.NET多線程

2010-04-14 09:20:26

.NET多線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)