作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我每天都有报告,我正在尝试从远程 Web 服务收集大量报告,我的代码如下所示:
public static void ProcessEnMasse(System.DateTime fromDate, DateTime endDate)
{
System.Threading.ThreadPool.SetMaxThreads(10, 10);
for (System.DateTime d = fromDate; d <= endDate; d = d.AddDays(1))
{
System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(day => ProcessOneDay(d)));
}
}
public static void ProcessOneDay(System.DateTime theDate)
{
Log.Debug(string.Format("Processing {0:yyyy-MM-dd}...", theDate));
var thePackager = new DataPackager();
thePackager.CreateDatabaseImportPackage(theDate, theDate, true, false);
}
...当我查看日志时,我注意到几个线程正在处理相同的日期。为什么会这样,我需要做什么来防止这种情况发生?
最佳答案
你需要注意闭包(稍后我会给出更完整的解释)
基本上,您的代码应该是这样的:
public static void ProcessEnMasse(System.DateTime fromDate, DateTime endDate)
{
System.Threading.ThreadPool.SetMaxThreads(10, 10);
for (System.DateTime d = fromDate; d <= endDate; d = d.AddDays(1))
{
System.DateTime newD = d;
System.Threading.ThreadPool.QueueUserWorkItem
(new System.Threading.WaitCallback(day => ProcessOneDay(newD)));
}
}
Here is Jon Skeet's chapter on closures
高级想法是(在您的原始代码中)当您传入 d
时,它实际上捕获了该变量,编译后的代码将使该变量充当全局共享变量.因此,当您点击下一个 for
步骤时,d
不仅会在您的循环中更新,还会在您刚刚将其传递给的函数中更新。
这是高水平,但我真的建议阅读 Jon Skeet 的文章,因为它写得非常好。
Here is another article如果您正在寻找更多 :)
关于c# - 我的线程池做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9948626/
我是一名优秀的程序员,十分优秀!