我正在开发一个简单的 irc 聊天机器人(专门用于 twitch.tv 流),并且我正在使用 List 来保留频道中所有用户的列表。当有人离开或加入时,我会在列表中添加或删除他们。然后我有一个线程每分钟运行一次,检查流是否在线,如果在线,它会向我的用户列表中的所有人分发“货币”。
我相信您已经可以看到我的问题出在哪里。如果有人在我的程序循环遍历列表中的用户时离开或加入,那么我会收到一个 Collection Modified 异常。目前,作为一种解决方法,我只是制作一个临时列表并将真实列表复制到其中,然后循环遍历临时列表,但我只是好奇是否有“更好”的方法来做到这一点?
快速伪代码:
private List<string> users = new List<string>();
private void IrcInitialize(){
//connect to irc stuff
//blah
//blah
//blah
Thread workThread = new Thread(new ThreadStart(doWork());
workThread.Start();
}
private void ircListener(){
parseIRCMessage(StreamReader.ReadLine());
}
private void parseIRCMessage(msg){
if (msgType == "JOIN"){
users.Add(user);
}
else if (msgType == "PART"){
users.Remove(user);
}
}
private void doWork(){
while (true) {
if (streamOnline() && handOutTime()){
handOutCurrency();
}
Thread.Sleep(60000);
}
}
private void handOutCurrency(){
List<string> temp = users; //This is what I'm currently doing
foreach (String user in temp) {
database.AddCurrency(user, 1);
}
}
还有其他建议吗?