多Task执行时ModasConfig转换方法返回重复结果问题
多Task执行时配置字符串生成结果一致问题
问题现象
循环创建3个Task,每个Task针对不同设备生成配置字符串,但所有Task返回的字符串完全相同:
- 在CHECK-Point1处检查字典,每个Task的
DevName修改值正确(对应不同设备ID) - 在CHECK-Point2处检查转换后的字符串,3个Task的结果完全一致(本该各不相同)
将配置生成逻辑移至Task外部后,结果恢复正确,怀疑问题与Task的闭包捕获有关。
原代码实现
主循环代码
List<Task> tasks = new List<Task>(); foreach (DSDevice device in validdevices) { var task = Task.Run(() => { var conf = PrepareModasConfig(device, alternativconfig); //CHECK-Point1 string config = ModasDicToConfig(conf); //CHECK-Point2 if (config != null) { //Do Stuff } else { //Do other Stuff } }); tasks.Add(task); } Task.WaitAll(tasks.ToArray());
PrepareModasConfig方法(修改默认配置字典)
private Dictionary<string, Dictionary<string, string>> PrepareModasConfig(DSDevice device, string alternativeconfig) { try { Dictionary<string, Dictionary<string, string>> config = new Dictionary<string, Dictionary<string, string>>(Project.project.ModasConfig.Config); if (config.ContainsKey("[Main]")) { if (config["[Main]"].ContainsKey("DevName")) { config["[Main]"]["DevName"] = device.ID; } } return config; } catch { return null; } }
ModasDicToConfig方法(字典转字符串)
private string ModasDicToConfig(Dictionary<string, Dictionary<string, string>> dic) { string s = string.Empty; try { foreach (string key in dic.Keys) { s = s + key + "\r\n"; foreach (string k in dic[key].Keys) { s = s + k + "=" + dic[key][k] + "\r\n"; } s = s + "\r\n"; } return s; } catch { return null; } }
默认字典结构(简化版)
{ {"[Main]", {"DevName", "Default"}, ... }, ... }
预期与实际生成字符串示例
预期每个字符串的DevName对应不同设备ID:
[Main] DevName=003 <--此处应与Device.ID对应,各不相同 ... [...]
实际所有Task生成的字符串中DevName值完全一致。
修改后可正常运行的代码
List<Task> tasks = new List<Task>(); foreach (DSDevice device in validdevices) { var conf = PrepareModasConfig(device, alternativconfig); //CHECK-Point1 string config = ModasDicToConfig(conf); //CHECK-Point2 var task = Task.Run(() => { if (config != null) { //Do Stuff } else { //Do other Stuff } }); tasks.Add(task); } Task.WaitAll(tasks.ToArray());
内容的提问来源于stack exchange,提问作者Toby_Stoe
相关产品推荐
相关产品推荐

