Kei*_*thi 3 c# concurrency list
我正在研究一个简单的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);
}
}
Run Code Online (Sandbox Code Playgroud)
还有其他建议吗?
我建议使用ConcurrentBag<string>的users.
这允许对用户进行多线程访问,即使在枚举时也是如此.
最重要的是你不必担心locking.
| 归档时间: |
|
| 查看次数: |
3690 次 |
| 最近记录: |