我有以下代码:
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
,因此无需报警。
答案 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替换。最有可能解决诊断信息。