编程语言
首页 > 编程语言> > c#-异常“集合已被修改”(未修改)

c#-异常“集合已被修改”(未修改)

作者:互联网

我在这段代码中遇到了这个异常,无法理解为什么

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)后抛出

stacktrace中的异常行是包含foreach的行(btcTX中的var tx)

我尝试使用2个不同的列表,然后在完成foreach后更新主列表,如您在上面的代码中看到的那样,但是没有解决.

解决方法:

您仍然只有一个清单.
以下语句仅使_btcTX指向与btcTX相同的列表实例:

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

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

标签:collections,asynchronous,c
来源: https://codeday.me/bug/20191210/2105007.html