成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C# 使用多線程如何傳遞兩個以上參數(shù)的實現(xiàn)方法(附示例)

開發(fā) 后端
某些情況下當(dāng)我們啟動一個線程的時候會向該線程傳遞參數(shù),有時除了功能上需要之外,我覺得還有就是為了我們能管理好啟動的線程組(當(dāng)然,只開一兩個線程什么的也談不上不好管理了,我說的線程組是指10+的線程,我們很難去主動控制的)。

某些情況下當(dāng)我們啟動一個線程的時候會向該線程傳遞參數(shù),有時除了功能上需要之外,我覺得還有就是為了我們能管理好啟動的線程組(當(dāng)然,只開一兩個線程什么的也談不上不好管理了,我說的線程組是指10+的線程,我們很難去主動控制的)。

因為剛接觸C#,所以還沒有在C#下用過多線程去實現(xiàn)某些功能。通過學(xué)習(xí)我發(fā)現(xiàn)單純的去啟動線程很容易,反而是想要往線程中傳一些參數(shù)變得有點說道了,這里我想說傳入?yún)?shù)的數(shù)量為>=2。不過我們還是一步一步的來,帶大家過一遍C#下的多線程怎么搞。

以上一篇講的網(wǎng)絡(luò)通信的例子,把整個過程走一遍。這里網(wǎng)絡(luò)通信只是作為一個講解的示例,依舊是在控制臺(Console)程序下實現(xiàn)的。

當(dāng)Server端想要能與多個Client端進(jìn)行連通的話,就必須用到多線程機制,我的思路:當(dāng)程序啟動后,Server端自己開一個專門用于進(jìn)行監(jiān)聽的線程,這樣主程序如果想做其他事也就不耽誤了。當(dāng)監(jiān)聽線程檢測到有連接的請求,就為這個IP單***建一個新的Socket(我們暫時稱為SA Socket)進(jìn)行通信用,當(dāng)然,這個SA通信的內(nèi)容(比如:收發(fā)消息)就是在一個新的線程或者兩個(我們暫時稱為TA線程)里實現(xiàn)的了,這個時候就需要我們往TA線程里傳入SA的專有ID,讓TA線程只專門為SA服務(wù)。之后的就依次類推了。

下面創(chuàng)建一個監(jiān)聽線程,這也是一個C#下最簡單的多線程使用——創(chuàng)建多線程

  1. Thread ListenThread = new Thread(new ThreadStart(ServerListener));   
  2. ListenThread.Start(); 

對,就是這么easy,Thread構(gòu)造函數(shù)里的參數(shù)類型為ThreadStart,這個東西官方解釋是一個委托(啊,這里就不講委托了,好像是C#特有的吧?反正我理解就是一個函數(shù)指針類型的東西或者是說某函數(shù)的別名,至于如何關(guān)聯(lián)方法與委托,就是用new 委托名(函數(shù)名)的方法),表示此線程開始執(zhí)行時要調(diào)用的方法。

關(guān)于委托大家可以下載http://down.51cto.com/data/1155877這個PPT,第229頁處有詳細(xì)講解,簡單易懂。

如上所說,在監(jiān)聽線程里我會創(chuàng)建一個監(jiān)聽的socket,然后有連接的話,會返回一個新的Socket對象,看代碼:

  1. //用于連接通道的socket,我默認(rèn)創(chuàng)建了5個,也就是說與Server端最多只能連通5個socket   
  2. Socket[] CommunicationSocket = new Socket[5];   
  3. //index來維護(hù)所創(chuàng)建的socket數(shù)組   
  4. int index = 0;   
  5. …省略…   
  6. //如有Client進(jìn)行連接,返回一個新的socket   
  7. CommunicationSocket[index] = ListenSocket.Accept(); 

接下來就是本篇的關(guān)鍵部分了,由于我已經(jīng)創(chuàng)建好了一個用于通信的CommunicationSocket,所以現(xiàn)在需要去創(chuàng)建一個獨立的線程,用于專門為這個新的Socket作通信使用,而我傳入的參數(shù)就是CommunicationSocket這個對象以及這個對象在socket數(shù)組中的位置index。
 

既然new ThreadStart()只能傳入一個方法名,而沒有給我們傳參數(shù)的地方,那么針對于這個情況,我們需要用點小技巧,那就是使用類,看代碼:

  1. //消息操作類,用于傳入線程   
  2. public class MessageHandler   
  3. {   
  4.      Socket socket = null;   
  5.      int index = 0;   
  6.      bool StopFlag = false;   
  7.      public MessageHandler(Socket socket, int index)   
  8.      {   
  9.         this.socket = socket;   
  10.         this.index = index;   
  11.         Console.WriteLine("線程" + this.index + "號被創(chuàng)建!");   
  12.      }   
  13.      //接收線程調(diào)用的函數(shù)   
  14.      public void ReceiveMessage()   
  15.     {   
  16.         byte[] buffer = newbyte[1024*4];   
  17.         string message = null;   
  18.         try 
  19.         {   
  20.             while (!StopFlag)   
  21.             {   
  22.                 int result = this.socket.Receive(buffer, 0, buffer.Length, SocketFlags.None);   
  23.                 if (result < 0)   
  24.                 {   
  25.                     break;   
  26.                 }   
  27.                 message = System.Text.Encoding.UTF8.GetString(buffer);   
  28.                 Console.Write("Client(" + DateTime.Now.ToShortTimeString() + "):" + message.Trim());   
  29.                 Console.WriteLine();         
  30.             }   
  31.          }   
  32.           catch (System.Exception ex)   
  33.           {   
  34.               Console.WriteLine(ex.ToString());this.socket.Close();   
  35.           }   
  36.     }   
  37.     //發(fā)送線程調(diào)用的函數(shù)   
  38.     public void SendMessage()   
  39.     {   
  40.         byte[] buffer = newbyte[1024 * 4];   
  41.         string message = null;   
  42.         try 
  43.         {   
  44.             while (!StopFlag)   
  45.             {   
  46.                 message = Console.ReadLine();   
  47.                 if (message.ToLower().Equals("byebye"))   
  48.                 {   
  49.                     StopFlag = true;   
  50.                 }   
  51.                 buffer = System.Text.Encoding.UTF8.GetBytes(message);   
  52.                 this.socket.Send(buffer);         
  53.              }   
  54.          }   
  55.          catch (System.Exception ex)   
  56.          {                        
  57.             Console.WriteLine(ex.ToString());this.socket.Close();   
  58.          }   
  59.     }   

這是我自己定義的消息操作類,大家看看,這個類的里面即實現(xiàn)了利用socket發(fā)送消息,也實現(xiàn)了接收消息的方法。寫到這大家有沒有來點靈感呢?再繼續(xù)往下看:

  1. //如果出現(xiàn)新的socket通道,那么分別創(chuàng)建一個該通道的接收線程與發(fā)送線程   
  2. //創(chuàng)建 MessageHandler類的對象,同時將參數(shù)傳入到該對象中去,該實例的方法用于作為線程的目標(biāo)方法   
  3. MessageHandler MsgHandler = new MessageHandler(CommunicationSocket[index], index);   
  4. ReceiveThread[index] = new Thread(new ThreadStart(MsgHandler.ReceiveMessage));   
  5. ReceiveThread[index].Start();   
  6. SendThread[index] = new Thread(new ThreadStart(MsgHandler.SendMessage));   
  7. SendThread[index].Start();   
  8. index++; 

這樣就實現(xiàn)了往線程里傳遞1個以上的參數(shù)了。

這里主要就是展示一下如何去傳多個參數(shù),對于多線程的管理等細(xì)節(jié)上還是有很多漏洞的,所以大家挑干的來就好了。

另外我附上原碼,跟文章中的有點出路,主要是在文章中我對一些變量名稱稍加進(jìn)行了修改,便于大家看代碼。

***要說的是在C#多線程中傳遞一個參數(shù)的時候,有另外的專門方法,記得也是跟委托有關(guān),不過具體我只是當(dāng)時看了一下,這會兒已經(jīng)記不得了,感興趣的朋友可以去搜一下,不過話說回來,既然都會傳多個參數(shù)了,傳一個參數(shù)的話應(yīng)該也很好搞定的。[[112899]][[112899]][[112899]]

希望能幫到有需要的人。

博客鏈接:http://zhouhongyu1989.blog.51cto.com/2931598/1410687

責(zé)任編輯:林師授 來源: 51cto博客
相關(guān)推薦

2009-08-28 15:57:56

C#線程傳遞參數(shù)

2009-08-27 17:47:18

C#匿名方法作為參數(shù)傳

2009-09-07 03:23:40

C# Main方法

2024-02-27 10:44:58

C#線程后端

2024-10-18 16:58:26

2021-03-26 05:54:00

C#數(shù)據(jù)方法

2021-06-10 00:13:43

C#隊列數(shù)據(jù)

2024-05-21 11:09:17

2024-10-14 16:25:59

C#線程鎖代碼

2010-07-17 00:50:12

batch Telne

2009-08-12 18:04:44

編寫C#多線程

2024-12-30 06:00:00

C#線程編程

2024-05-10 07:44:23

C#進(jìn)程程序

2009-08-12 16:37:22

C#變量類型轉(zhuǎn)換

2024-10-21 16:59:37

C#編程多線程

2009-08-26 18:13:55

C#多線程lock

2011-04-25 14:42:10

C#lock

2024-04-23 09:35:27

線程終止C#多線程編程

2009-08-28 16:43:57

C#多線程學(xué)習(xí)

2009-09-04 15:09:48

C#多線程啟動Squa
點贊
收藏

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

主站蜘蛛池模板: 国产精品视频一区二区三 | 国产视频二区 | 久草视频在 | 久久亚洲一区二区三区四区 | 欧美日韩亚洲视频 | 一区二区日本 | 中文字幕亚洲一区二区三区 | 国产一级在线 | 欧美日韩高清一区二区三区 | 91在线视频观看免费 | 99国内精品久久久久久久 | 精品成人在线 | h视频网站在线观看 | 一区二区日本 | a在线视频 | 婷婷久久五月天 | 亚洲欧洲综合av | 日韩色综合 | 午夜理伦三级理论三级在线观看 | 精品免费国产一区二区三区四区介绍 | 久久久久久久久久久丰满 | 亚洲国产精品一区在线观看 | 在线播放国产一区二区三区 | 欧美一级视频 | 国产一区二区在线看 | 午夜看看 | 亚洲综合在 | 亚洲成av人片在线观看无码 | 好姑娘影视在线观看高清 | 日韩日b视频| 亚洲喷水| 国产清纯白嫩初高生视频在线观看 | 又爽又黄axxx片免费观看 | japanhdxxxx裸体| 人人做人人澡人人爽欧美 | 久久精品一区二区三区四区 | 欧美精品一区二区三区视频 | 欧美日韩亚洲一区 | 精品视频一区二区三区 | 亚洲精品乱码久久久久久蜜桃91 | 日本黄色的视频 |