我在這段代碼中遇到了這個異常,不明白為什么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 關注
- 91 瀏覽
添加回答
舉報
0/150
提交
取消