1

我有以下代码:

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正在传递一个。我的猜测是,当我在任务中使用字典时,字典作为不安全指针传递给任务线程。另一方面,我可能完全错了。我试图找到一些权威人士谈论这个,但失败了。谁能解释运行时在这种情况下的作用?

顺便说一句:无论如何我们都在Dictionary换一个ConcurrentDictionary,所以不需要报警。

4

1 回答 1

1

字典如何通过引用传递给任务

Dictionary 是一种引用类型,因此它是按值传递还是按引用传递并不重要。但碰巧闭包就像按引用。

在您的代码中:

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

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

字典是在 Task lambda 的范围之外声明的,但 lambda 确实按名称使用它。这是允许的,称为“关闭”变量。

这意味着多个线程可以访问您的字典,它应该被 ConcurrentDictionary 替换。这很可能会解决诊断消息。

于 2013-07-15T09:40:21.207 回答