前一段时间写了一个定期查询在线用户有无消息提醒的功能大概实现是这样:在服务器端写了一个服务,首先开启UDP监听、2个Timer1.定时查询在线用户提醒消息数据库状态-5秒Timer,查询到的结果添加至一个待办的HashTable中
2.定时查询待办的HashTable,发送消息-5秒Timer客户端接收到消息后返回收到信息,删除HashTable对应值还有一个验证服务器是否在线的方法,就是客户端定时给服务器发验证,服务器回发这样。公司人很多(大概500),上班直接开启客户端,开始是没问题,一段时间之后经测试客户端还是能收到服务器在线的数据报,但是收不到提醒消息,数据库状态为提醒,貌似是服务不走查询消息那个Timer了...求高手解答,或者给一个此功能其他的解决方案。要求效率第一……
2.定时查询待办的HashTable,发送消息-5秒Timer客户端接收到消息后返回收到信息,删除HashTable对应值还有一个验证服务器是否在线的方法,就是客户端定时给服务器发验证,服务器回发这样。公司人很多(大概500),上班直接开启客户端,开始是没问题,一段时间之后经测试客户端还是能收到服务器在线的数据报,但是收不到提醒消息,数据库状态为提醒,貌似是服务不走查询消息那个Timer了...求高手解答,或者给一个此功能其他的解决方案。要求效率第一……
最好调试一下服务。服务问题很麻烦的,有时候服务CPU 大, 或者内存一直猛涨 都会导致服务问题的。
及时释放资源
我想问的就是这个。。for怎么循环HashTable?
{
try
{
foreach (DictionaryEntry var in _htRemind)
{
if (!htTodo.ContainsKey(var.Key))
{
htTodo.Add(var.Key, var.Value);
}
}
}
catch (Exception exp)
{
FileLog.WriteErrLog(exp.ToString());
}
}
这个是监听到客户端返回接收成功信息的方法private void UpdateRemind(string _remote, EndPoint _sender)
{
try
{
if (htTodo.ContainsKey(Convert.ToInt32(_remote.Split('|')[1])))
{
htTodo.Remove(Convert.ToInt32(_remote.Split('|')[1]));
remind.UpdateRemind(_remote.Split('|')[1]);
}
}
catch (Exception exp)
{
FileLog.WriteErrLog(exp.ToString());
}
}
这个是现在报错的方法,提醒消息列表Timer发送的方法void listTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
string txt = "待办数目:" + htTodo.Count.ToString() + System.Environment.NewLine + DateTime.Now.ToString();
FileLog.WriteListLog(txt);
if (htTodo.Count != 0)
{
try
{
foreach (DictionaryEntry var in htTodo) ----如果接收到客户端成功消息,删除Hashtable对应值,则集合已修改,走Catch跳出循环,等待下一次Timer……
{
string _iRMOper = GetiRMOper(var.Value.ToString());
EndPoint userEP = GetUserAddress(_iRMOper);
if (userEP != null)
{
byte[] byteMsg = Encoding.Default.GetBytes(MSG + "|" + var.Key + "|" + var.Value + "|");
sock.SendTo(byteMsg, userEP); //Thread.Sleep(5000);
}
}
}
catch (Exception exp)
{
FileLog.WriteErrLog(exp.ToString());
}
} }
如果解决这个错误问题呢,让它不跳出循环,怎么用for循环Hashtable