字典如何通过参数传递给任务

时间:2013-07-15 07:33:41

标签: c# task-parallel-library generic-collections

我有以下代码:

Dictionary<string, WSResponse> responseDictionary = new Dictionary<string, WSResponse>();
List<Task> taskList = new List<Task>();
foreach (string ID in IDs)
{
      string localID = ID;

      Task newTask = Task.Factory.StartNew(() =>
      {
           WSResponse response = Query.GetListFor(localID);                    
           responseDictionary.Add(localID, response);
      });
      taskList.Add(newTask);
}

Task.WaitAll(taskList.ToArray());

在运行此代码的服务器上,我们的IT团队拥有服务器监控软件,他们告诉我们该软件报告正在传递unsafe static Dictionary。我的猜测是,当我在Task中使用Dictionary时,字典作为不安全的指针传递给Task线程。另一方面,我可能完全错了。我试图找到一些权威人士谈论这个,但失败了。任何人都可以解释在这种情况下运行时的作用吗?

btw:无论如何,我们正在将Dictionary换成ConcurrentDictionary,因此无需报警。

1 个答案:

答案 0 :(得分:1)

  

字典如何通过参数传递给任务

Dictionary是一种引用类型,因此如果通过-value或by-ref传递它并不重要。但实际上,封闭主要是像-ref一样。

在您的代码中:

Dictionary<string, WSResponse> responseDictionary = ...;

  Task newTask = Task.Factory.StartNew(() =>
  {
       WSResponse response = Query.GetListFor(localID);                    
       responseDictionary.Add(localID, response);
  });

字典在Task lambda的范围之外声明,但lambda确实按名称使用它。这是允许的,并称为'closing over'变量。

这意味着多个线程可以访问您的Dictionary,它应该被ConcurrentDictionary替换。最有可能解决诊断信息。