[英](Sometimes) The given key was not present in the dictionary
我正在使用下面的代碼以list參數啟動線程,但有時會引發異常:
給定的鍵在字典中不存在
從這一行:
Thread MoveThread = new Thread(() => MoveTask(ControllerDictionary[i]));
我該如何解決該錯誤?
完整代碼:
var ControllerDictionary = ConfigFile.ControllerList.Select((c, i) => new { Controller = c, Index = i })
.GroupBy(x => x.Index % AppSettings.SimultaneousProcessNumber)
.Select((g, i) => new { GroupIndex = i, Group = g })
.ToDictionary(x => x.GroupIndex, x => x.Group.Select(xx => xx.Controller).ToList());
for (int i = 0; i < ControllerDictionary.Count; i++)
{
Thread MoveThread = new Thread(() => MoveTask(ControllerDictionary[i]));
MoveThread.Start();
foreach (var Controller in ControllerDictionary[i])
Logger.Write(string.Format("{0} is in move thread {1}.", Controller.Ip, (i + 1)),EventLogEntryType.Information, AppSettings.LogInfoMessages);
}
您正在捕獲變量 i
,而不是其值。 因此,當前您可能有多個線程使用相同的索引調用MoveTask
...,有時i
的值可能等於ControllerDictionary.Count
。
如果將 i
的副本帶入循環中的變量,則可以解決此問題,因為在循環的每次迭代中都會得到一個單獨的變量:
for (int i = 0; i < ControllerDictionary.Count; i++)
{
int index = i;
Thread MoveThread = new Thread(() => MoveTask(ControllerDictionary[index]));
...
}
甚至更好的是,從線程中完全提取ControllerDictionary
獲取:
for (int i = 0; i < ControllerDictionary.Count; i++)
{
var value = ControllerDictionary[i];
Thread MoveThread = new Thread(() => MoveTask(value));
...
}
此外,還不清楚為什么要使用字典。 既然您知道鍵都將在[0, count)
范圍內[0, count)
為什么不只使用數組呢? 您可以將查詢更改為:
var controllerLists = ConfigFile.ControllerList
.Select((c, i) => new { Controller = c, Index = i })
.GroupBy(x => x.Index % AppSettings.SimultaneousProcessNumber)
.Select(g => g.Select(xx => xx.Controller).ToList())
.ToArray();
問題在這里:
Thread MoveThread = new Thread(() => MoveTask(ControllerDictionary[i]));
該匿名函數將在不同的線程上執行,並且不能保證局部變量將是有效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.