各位前輩早安
小弟剛剛想用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