You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:45:27