我在这段代码中遇到了这个异常,不明白为什么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 循环,但将要删除的索引和要添加的项目存储在循环内,然后在循环后执行实际的添加/删除(删除应该从最后一个索引到第一个索引完成) .
- 1 回答
- 0 关注
- 76 浏览
添加回答
举报
0/150
提交
取消