簡體   English   中英

(有時)詞典中不存在給定的鍵

[英](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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM