看板 C_Sharp 關於我們 聯絡資訊
※ 引述《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
teamspike:cool...現在就來試試看 05/30 15:56