remoting超级难题

hljlpz 2010-08-06 09:55:26
客户端注册服务端事件
foreach (Delegate del in BroadCastEvent.GetInvocationList())
{
try
{
tempEvent = (BroadCastEventHandler)del;
tempEvent(info);
}
catch
{
MessageBox.Show( "事件订阅者 " + index.ToString() + "发生错误,系统将取消事件订阅! ");
BroadCastEvent -= tempEvent;
}
当客户端断网后,程序要45秒左右才能引发异常然后BroadCastEvent -= tempEvent; 能否缩短这个时间,最好在配置文件中更改,或者有其他办法解决
补充:异步方式考虑过,但是我的调用量非常大 因为不能马上返回可能导致线程池满,造成堵塞
...全文
139 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yunpeng8800 2011-01-06
  • 打赏
  • 举报
回复
好,很感谢,我也遇到了这种问题。
hljlpz 2010-08-07
  • 打赏
  • 举报
回复
webservice不支持远程事件,无法做到服务端主动通知
udp、tcp涉及防火墙问题
remoting的http信道是个不错的选择,唯一的遗憾就是客户端非正常断开后,服务端要在45秒后才引发异常
如果我采用服务端轮询客户端来判断,那么BroadCastEvent -= tempEvent; 就成了鸡肋
我现在只是想缩短处罚事件的超时时间
gomoku 2010-08-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 hljlpz 的回复:]
...
异步方式考虑过,但是我的调用量非常大
...
[/Quote]
可能是你整体设计造成的困难。比如用Remoting去做大型的聊天程序,当然不能有好的结局。
hljlpz 2010-08-07
  • 打赏
  • 举报
回复
早上起来顶,期待高人出现
hljlpz 2010-08-07
  • 打赏
  • 举报
回复
问题基本解决了,把我的方法公布出来 希望以后遇到同样问题的哥们有个参考
第一步: <channel port="8081" ref="http" timeout="2000">
设置超时时间,这个时间我测试过是有效果的。
客户端服务端都要设置,具体根据当地的网络情况

第二步:在触发事件时采用委托
private void OnSendConflictEvent(RemSendConflictEventArgs e)
{
if (RemSendConflictEvent != null)
{
RemSendConflictEventHandler tempEvent = null;
foreach (Delegate del in this.RemSendConflictEvent.GetInvocationList())
{
tempEvent = (RemSendConflictEventHandler)del;
MyDelegateOnSendConflictEvent md = new MyDelegateOnSendConflictEvent(Ia_OnSendConflictEvent);
IAsyncResult Iar = md.BeginInvoke(tempEvent, e, null, null);
}
}
}
没有直接tempEvent .BeginInvoke是因为要在服务端捕获异常
这样基本大的通信量,是可以满足了
当线程池满时,会在设置的时间内超时 不会出现阻塞,不会印象其他客户端的事件触发
hljlpz 2010-08-06
  • 打赏
  • 举报
回复
这个问题,我搜索了好多,都没有正面准确的答复,希望有明白人出现
hljlpz 2010-08-06
  • 打赏
  • 举报
回复
断网还好说,如果是断电呢?或者客户端异常退出,还没有来得及注销事件?
guohelv0519 2010-08-06
  • 打赏
  • 举报
回复
应该在线程中监视客户端本地连接状态

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧