为了账号安全,请及时绑定邮箱和手机立即绑定

异常“集合已被修改”,当它还没有被修改时

异常“集合已被修改”,当它还没有被修改时

C#
GCT1015 2022-12-24 12:20:30
我在这段代码中遇到了这个异常,不明白为什么private static void LoopBTCtx(){    Task.Factory.StartNew(async () =>    {        while (true)        {            try            {                Thread.Sleep((int)TimeSpan.FromSeconds(10).TotalMilliseconds);                List<(string, SocketMessage, int)> _btcTX = btcTX;                foreach (var tx in btcTX)                {                    int newConfirmations = GetBTCtxConfirmations(tx.Item1);                    if (tx.Item3 != newConfirmations)                    {                        _btcTX.Remove(tx);                        if (newConfirmations < 6)                        {                            _btcTX.Add((tx.Item1, tx.Item2, newConfirmations));                        }                        await tx.Item2.Channel.SendMessageAsync($"{tx.Item2.Author.Mention}, ``{tx.Item1}`` now has **{newConfirmations}**/6 confirmation{(newConfirmations != 1 ? "s" : null)}.");                    }                }                btcTX = _btcTX;            }            catch (Exception e)            {                Console.WriteLine(e);            }        }    });}它在处理第一个列表元素 ( foreach)后抛出堆栈跟踪中的异常行是包含foreach (var tx in btcTX)我尝试使用 2 个不同的列表,然后在完成后更新主列表foreach,正如您在上面的代码中看到的那样,但它没有修复。
查看完整描述

1 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

你还有一份清单。以下语句只是使 _btcTX 指向与 btcTX 相同的列表实例:

List<(string, SocketMessage, int)> _btcTX = btcTX;

所以实际上主列表是在 Remove() 和/或 Add() 中修改的。删除/添加项目的一种方法是使用索引(从最后到第一个)执行常规 for 循环,然后您将能够毫无问题地删除/添加项目。另一种方法是保留 foreach 循环,但将要删除的索引和要添加的项目存储在循环内,然后在循环后执行实际的添加/删除(删除应该从最后一个索引到第一个索引完成) .


查看完整回答
反对 回复 2022-12-24
  • 1 回答
  • 0 关注
  • 76 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信