推 teamspike:cool...現在就來試試看 05/30 15:56
※ 引述《teamspike (市政府7F)》之銘言:
: 查了一下說明,原來AcceptSocket()會鎖定程式執行,
看你的設計, 不一定要由你自己開一個 thread 去處理,
其中一個方案是使用 BeginAcceptSocket()與EndAcceptSocket()
就變成如果 socket accpet到client, 才去呼叫你指定的callback funtion
這樣就不會卡住了~
在 .NET 幾乎所有這種會 block 很久的呼叫, 都會有對應的 BeginXXX()與EndXXX()
非同步呼叫可以使用
觀念上是這類 event-driven的系統大多由一個 Message Loop 來實作..
當你按下 buttonConnect 與 buttonDisconnect 時,
就將 他們的 OnClick 訊息放進一個 Message Queue 中, 然後有個像這樣子的loop
while( MessageQueue 中還有訊息 ) {
Message = MessageQueue.Dequeue();
switch( Message.Type) {
case OnClick:
依 傳送者 呼叫對應的
buttonConnect_OnClick() 或 buttonDisConnect_OnClick()
case OnXXXXX;
/* 各種訊息及其處理的方式 */
}
}
所以 MessageLoop 一進到你的 buttonConnect_OnClick() 後, 在return前,
就沒辦法處理其他的 Message 了~
包括把視窗界面重繪, 所以你會看到視窗白白的, 好像當掉的樣子..
不過你要注意, 雖然使用 BeginXXXX() 這類的非同步呼叫,
就不會卡在 OnClick 的時候. 可是 OnAccept 仍是使用MessageLoop來處理,
所以你的callback function 也要盡快處理後續的工作以免卡到別人..
若沒有可使用的非同步呼叫, 那你就要用 thread 來解決了..
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.139.142.70