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

成都創(chuàng)新互聯(lián)公司成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元下陸做網(wǎng)站,已為上家服務(wù),為下陸各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
因?yàn)閯偨佑|C#,所以還沒(méi)有在C#下用過(guò)多線程去實(shí)現(xiàn)某些功能。通過(guò)學(xué)習(xí)我發(fā)現(xiàn)單純的去啟動(dòng)線程很容易,反而是想要往線程中傳一些參數(shù)變得有點(diǎn)說(shuō)道了,這里我想說(shuō)傳入?yún)?shù)的數(shù)量為>=2。不過(guò)我們還是一步一步的來(lái),帶大家過(guò)一遍C#下的多線程怎么搞。
以上一篇講的網(wǎng)絡(luò)通信的例子,把整個(gè)過(guò)程走一遍。這里網(wǎng)絡(luò)通信只是作為一個(gè)講解的示例,依舊是在控制臺(tái)(Console)程序下實(shí)現(xiàn)的。
當(dāng)Server端想要能與多個(gè)Client端進(jìn)行連通的話,就必須用到多線程機(jī)制,我的思路:當(dāng)程序啟動(dòng)后,Server端自己開(kāi)一個(gè)專門用于進(jìn)行監(jiān)聽(tīng)的線程,這樣主程序如果想做其他事也就不耽誤了。當(dāng)監(jiān)聽(tīng)線程檢測(cè)到有連接的請(qǐng)求,就為這個(gè)IP單***建一個(gè)新的Socket(我們暫時(shí)稱為SA Socket)進(jìn)行通信用,當(dāng)然,這個(gè)SA通信的內(nèi)容(比如:收發(fā)消息)就是在一個(gè)新的線程或者兩個(gè)(我們暫時(shí)稱為TA線程)里實(shí)現(xiàn)的了,這個(gè)時(shí)候就需要我們往TA線程里傳入SA的專有ID,讓TA線程只專門為SA服務(wù)。之后的就依次類推了。
下面創(chuàng)建一個(gè)監(jiān)聽(tīng)線程,這也是一個(gè)C#下最簡(jiǎn)單的多線程使用——?jiǎng)?chuàng)建多線程
- Thread ListenThread = new Thread(new ThreadStart(ServerListener));
- ListenThread.Start();
對(duì),就是這么easy,Thread構(gòu)造函數(shù)里的參數(shù)類型為ThreadStart,這個(gè)東西官方解釋是一個(gè)委托(啊,這里就不講委托了,好像是C#特有的吧?反正我理解就是一個(gè)函數(shù)指針類型的東西或者是說(shuō)某函數(shù)的別名,至于如何關(guān)聯(lián)方法與委托,就是用new 委托名(函數(shù)名)的方法),表示此線程開(kāi)始執(zhí)行時(shí)要調(diào)用的方法。
關(guān)于委托大家可以下載http://down./data/1155877這個(gè)PPT,第229頁(yè)處有詳細(xì)講解,簡(jiǎn)單易懂。
如上所說(shuō),在監(jiān)聽(tīng)線程里我會(huì)創(chuàng)建一個(gè)監(jiān)聽(tīng)的socket,然后有連接的話,會(huì)返回一個(gè)新的Socket對(duì)象,看代碼:
- //用于連接通道的socket,我默認(rèn)創(chuàng)建了5個(gè),也就是說(shuō)與Server端最多只能連通5個(gè)socket
- Socket[] CommunicationSocket = new Socket[5];
- //index來(lái)維護(hù)所創(chuàng)建的socket數(shù)組
- int index = 0;
- …省略…
- //如有Client進(jìn)行連接,返回一個(gè)新的socket
- CommunicationSocket[index] = ListenSocket.Accept();
接下來(lái)就是本篇的關(guān)鍵部分了,由于我已經(jīng)創(chuàng)建好了一個(gè)用于通信的CommunicationSocket,所以現(xiàn)在需要去創(chuàng)建一個(gè)獨(dú)立的線程,用于專門為這個(gè)新的Socket作通信使用,而我傳入的參數(shù)就是CommunicationSocket這個(gè)對(duì)象以及這個(gè)對(duì)象在socket數(shù)組中的位置index。
既然new ThreadStart()只能傳入一個(gè)方法名,而沒(méi)有給我們傳參數(shù)的地方,那么針對(duì)于這個(gè)情況,我們需要用點(diǎn)小技巧,那就是使用類,看代碼:
- //消息操作類,用于傳入線程
- public class MessageHandler
- {
- Socket socket = null;
- int index = 0;
- bool StopFlag = false;
- public MessageHandler(Socket socket, int index)
- {
- this.socket = socket;
- this.index = index;
- Console.WriteLine("線程" + this.index + "號(hào)被創(chuàng)建!");
- }
- //接收線程調(diào)用的函數(shù)
- public void ReceiveMessage()
- {
- byte[] buffer = newbyte[1024*4];
- string message = null;
- try
- {
- while (!StopFlag)
- {
- int result = this.socket.Receive(buffer, 0, buffer.Length, SocketFlags.None);
- if (result < 0)
- {
- break;
- }
- message = System.Text.Encoding.UTF8.GetString(buffer);
- Console.Write("Client(" + DateTime.Now.ToShortTimeString() + "):" + message.Trim());
- Console.WriteLine();
- }
- }
- catch (System.Exception ex)
- {
- Console.WriteLine(ex.ToString());this.socket.Close();
- }
- }
- //發(fā)送線程調(diào)用的函數(shù)
- public void SendMessage()
- {
- byte[] buffer = newbyte[1024 * 4];
- string message = null;
- try
- {
- while (!StopFlag)
- {
- message = Console.ReadLine();
- if (message.ToLower().Equals("byebye"))
- {
- StopFlag = true;
- }
- buffer = System.Text.Encoding.UTF8.GetBytes(message);
- this.socket.Send(buffer);
- }
- }
- catch (System.Exception ex)
- {
- Console.WriteLine(ex.ToString());this.socket.Close();
- }
- }
- }
這是我自己定義的消息操作類,大家看看,這個(gè)類的里面即實(shí)現(xiàn)了利用socket發(fā)送消息,也實(shí)現(xiàn)了接收消息的方法。寫到這大家有沒(méi)有來(lái)點(diǎn)靈感呢?再繼續(xù)往下看:
- //如果出現(xiàn)新的socket通道,那么分別創(chuàng)建一個(gè)該通道的接收線程與發(fā)送線程
- //創(chuàng)建 MessageHandler類的對(duì)象,同時(shí)將參數(shù)傳入到該對(duì)象中去,該實(shí)例的方法用于作為線程的目標(biāo)方法
- MessageHandler MsgHandler = new MessageHandler(CommunicationSocket[index], index);
- ReceiveThread[index] = new Thread(new ThreadStart(MsgHandler.ReceiveMessage));
- ReceiveThread[index].Start();
- SendThread[index] = new Thread(new ThreadStart(MsgHandler.SendMessage));
- SendThread[index].Start();
- index++;
這樣就實(shí)現(xiàn)了往線程里傳遞1個(gè)以上的參數(shù)了。
這里主要就是展示一下如何去傳多個(gè)參數(shù),對(duì)于多線程的管理等細(xì)節(jié)上還是有很多漏洞的,所以大家挑干的來(lái)就好了。
另外我附上原碼,跟文章中的有點(diǎn)出路,主要是在文章中我對(duì)一些變量名稱稍加進(jìn)行了修改,便于大家看代碼。
***要說(shuō)的是在C#多線程中傳遞一個(gè)參數(shù)的時(shí)候,有另外的專門方法,記得也是跟委托有關(guān),不過(guò)具體我只是當(dāng)時(shí)看了一下,這會(huì)兒已經(jīng)記不得了,感興趣的朋友可以去搜一下,不過(guò)話說(shuō)回來(lái),既然都會(huì)傳多個(gè)參數(shù)了,傳一個(gè)參數(shù)的話應(yīng)該也很好搞定的。[[112899]][[112899]][[112899]]
希望能幫到有需要的人。
博客鏈接:http://zhouhongyu1989.blog./2931598/1410687
網(wǎng)站名稱:C# 使用多線程如何傳遞兩個(gè)以上參數(shù)的實(shí)現(xiàn)方法(附示例)
當(dāng)前網(wǎng)址:http://m.fisionsoft.com.cn/article/cdsojcs.html


咨詢
建站咨詢
