C#列表并发

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)

还有其他建议吗?

Ric*_*der 7

我建议使用ConcurrentBag<string>users.

这允许对用户进行多线程访问,即使在枚举时也是如此.

最重要的是你不必担心locking.

  • List&lt;T&gt; 是有序的, ConcurrentBag&lt;T&gt; 不是.. OP 可能想要保留顺序。 (2认同)
  • 附加阅读:[.Net 4.0中没有ConcurrentList <T>?](http://stackoverflow.com/questions/6601611/no-concurrentlistt-in-net-4-0) (2认同)