作者gundan (钢弹)
看板C_Sharp
标题[问题] WCF做的聊天程式,连传两次有问题
时间Sun Apr 22 17:49:28 2012
大家好,我做了一个聊天的程式
就是有一个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
1F:推 optimist9266:你不把notify里面的东西丢上来很难判断 04/23 04:10
3F:→ optimist9266:费时间 04/23 04:11
4F:→ gundan:谢谢! 04/23 08:54
※ 编辑: gundan 来自: 118.163.30.37 (04/23 16:12)
※ 编辑: gundan 来自: 118.163.30.37 (04/23 16:43)
5F:→ gundan:问题改过了,有人碰过这样的问题吗?谢谢! 04/23 16:44
※ 编辑: gundan 来自: 118.163.30.37 (04/24 10:33)