看板 C_Sharp 關於我們 聯絡資訊
各位前輩早安 小弟剛剛想用TcpListener實作網路連線 於是很開心的作一個只有兩個按鈕的小server 一個監聽連線,一個停止監聽這樣 就姑且叫button_Connect和button_disConnect吧 小弟原本以為很簡單的實作,就給他弄成下面那樣 private void button_Connect_Click(object sender, eventargs e) { . . . . . . 10 myTcpListener.Start(); 11 mySocket = myTcpListener.AcceptSocket(); . . . . } private void button_disConnect_Click(object sender, eventargs e) { myTcpListener.Stop(); } 很開心的執行了以後,發現會卡在按鈕Connect的第十行呢!! 查了一下說明,原來AcceptSocket()會鎖定程式執行, 傻傻的在那邊等Socket連線呢... 咦?原來可以先用Pending()來判斷嗎? 那沒人理我的時候就先不要AcceptSocket()不就好囉 於是興沖沖的在第10行和第11行中間加上了 while(!myTcpListener.Pending()) {}; 於是自以為很聰明的我,這次跟著小程式跑無限迴圈 button_disConnect根本按不下去... 很直覺的想法是,按下執行,就好像派出一個小綠人開始出發 這時候只有一個小綠人在程式碼裡面穿梭 當他在一個地方忙碌的時候,就沒有辦法去管其他地方的事情 因為button_Connect不管怎麼樣都還是會留他下來喝茶 這時候如果多幾個小綠人,比方說從button_disConnect再派出一個小綠人 執行button_disConnect的指令 小綠人2:"ㄟ該走了,我都已經Stop()了你不知道嗎?" 小綠人1:"你不會早點說阿..." 於是程式很美滿的結束 請問各位前輩,這種狀況是不是該應用多執行緒呢?(還沒看呢= =a) 就這個例子而言,該如何解決呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.216.193