gpt4 book ai didi

任务的 C# 控制台应用程序线程问题

转载 作者:行者123 更新时间:2023-11-30 22:23:26 25 4
gpt4 key购买 nike

我有以下代码片段:

lock (lockObject) 
{
foreach (KeyValuePair<string, List<string>> entry in productDictionary)
{
string writePath = String.Format(@"{0}\{1}-{2}.txt", directoryPath, hour,entry.Key);
Task writeFileTask = Task.Factory.StartNew(() => WriteProductFile(writePath, entry.Value));
}
}

productDictionary 是 ConcurrentDictionary<string, List<string>>我正在尝试迭代。对于每个键值对,我试图根据 Key 构造一个文件路径。然后写出存储在 Value 中的字符串列表.为此,我启动了一个调用以下方法的新任务:

public static void WriteProductFile(string filePath, List<string> productQuotes)
{
using(StreamWriter streamWriter = new StreamWriter(filePath))
{
productQuotes.ForEach(x => streamWriter.WriteLine(x));
}
}

单步执行代码,起初一切看起来都很好。在 WriteProductFile 的方法调用处设置断点显示正确的参数正在通过任务传递到方法中。但是,当我的程序实际执行到 WriteProductFile 方法时,参数变得不匹配。即,已传入与文件路径不匹配的字符串列表,因此一旦程序完成,我的数据就不好了。没有错误被抛出,程序执行正常,但错误的信息被写入了错误的文件。

我认为 ConcurrentDictionary 和 Lock 会处理可能出现的任何线程问题,但显然我错过了一些东西。有什么想法吗?

最佳答案

您正在捕获一个循环变量。您必须在循环内声明一个局部变量。

foreach (KeyValuePair<string, List<string>> entry in productDictionary) 
{
string writePath = String.Format(@"{0}\{1}-{2}.txt", directoryPath, hour, entry.Key);
List<string> list = entry.Value; // must add this.
Task writeFileTask = Task.Factory.StartNew(() => WriteProductFile(writePath, list));
}

在 C# 5 之前,单个循环变量用于循环的所有迭代。每个闭包引用相同的变量,因此当循环的新周期开始时更新值。要获得明确的解释,您应该阅读 Eric Lippert 的帖子:Closing over the loop variable considered harmfuil.

关于任务的 C# 控制台应用程序线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13383465/

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