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

我在这段代码中遇到了这个异常,不明白为什么


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,正如您在上面的代码中看到的那样,但它没有修复。


GCT1015
浏览 81回答 1
1回答

拉莫斯之舞

你还有一份清单。以下语句只是使 _btcTX 指向与 btcTX 相同的列表实例:List<(string,&nbsp;SocketMessage,&nbsp;int)>&nbsp;_btcTX&nbsp;=&nbsp;btcTX;所以实际上主列表是在 Remove() 和/或 Add() 中修改的。删除/添加项目的一种方法是使用索引(从最后到第一个)执行常规 for 循环,然后您将能够毫无问题地删除/添加项目。另一种方法是保留 foreach 循环,但将要删除的索引和要添加的项目存储在循环内,然后在循环后执行实际的添加/删除(删除应该从最后一个索引到第一个索引完成) .
打开App,查看更多内容
随时随地看视频慕课网APP