看板 C_Sharp 關於我們 聯絡資訊
大家好,我做了一個聊天的程式 就是有一個SERVER 然後CLIENT連進來 CLIENT可以傳訊息給對方這樣 問題改一下,應該是這樣 我有兩個finction bool add(Message message); bool notify(Message message); server有個資料結構,用add就是將message存在server 當server有新增或刪除會通知所有client 然後所有client實作void MessageAdded(Message message); 然後會在這做事 server的add長這樣 bool add(Message message) { if(addSuccess()) { Publish(message); return true; } return false; } notify也差不多 不過是通知某個client而已 我的程式中有個片段是 add(message1); notify(message2); 現在問題是 先用add再用notify會出現timeout(停在notify) 先用notify再用add就沒問題 剛剛debug過正常add會add完然後收到事件而跑到MessageAdd 但是如果是先add再notify add完MessageAdded事件還沒出現就先到notify 應該是這樣導致我的問題發生 請問這是什麼原因?有什麼解決方法嗎?謝謝! 找到問題了,問題是用ui thread調用add()的時候 ui thread 會被鎖住 這裡server callback (publish)回來的時候發現ui thread鎖住了 所以只能等在那邊,造成deadlock 最快的解決方法就是在實作client上面加上 [CallbackBehavior(UseSynchronizationContext = false)] 這個屬性 詳情請參考下面網址: http://blogs.msdn.com/b/mahjayar/archive/2006/11/07/winfx-usesynchronizationcontext-usage.aspx 縮址:http://ppt.cc/7o4s -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.169.230.183
optimist9266:你不把notify裡面的東西丟上來很難判斷 04/23 04:10
optimist9266:如果懶得找問題我建議用http://ppt.cc/,qGh 比較不浪 04/23 04:11
optimist9266:費時間 04/23 04:11
gundan:謝謝! 04/23 08:54
※ 編輯: gundan 來自: 118.163.30.37 (04/23 16:12) ※ 編輯: gundan 來自: 118.163.30.37 (04/23 16:43)
gundan:問題改過了,有人碰過這樣的問題嗎?謝謝! 04/23 16:44
※ 編輯: gundan 來自: 118.163.30.37 (04/24 10:33)