gpt4 book ai didi

c# - 我的线程池做错了什么?

转载 作者:行者123 更新时间:2023-11-30 20:06:18 27 4
gpt4 key购买 nike

我每天都有报告,我正在尝试从远程 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com