【发布时间】:2019-05-09 10:16:44
【问题描述】:
在使用Newtonsoft.Json 时,我在序列化为 JSON 文件时遇到问题。
在一个循环中,我在各个线程中执行任务:
List<Task> jockeysTasks = new List<Task>();
for (int i = 1; i < 1100; i++)
{
int j = i;
Task task = Task.Run(async () =>
{
LoadedJockey jockey = new LoadedJockey();
jockey = await Task.Run(() => _scrapServices.ScrapSingleJockeyPL(j));
if (jockey.Name != null)
{
_allJockeys.Add(jockey);
}
UpdateStatusBar = j * 100 / 1100;
if (j % 100 == 0)
{
await Task.Run(() => _dataServices.SaveAllJockeys(_allJockeys)); //saves everything to JSON file
}
});
jockeysTasks.Add(task);
}
await Task.WhenAll(jockeysTasks);
还有if (j % 100 == 0),正在尝试将集合_allJockeys 保存到文件中(我会做一些计数器以使其更可靠,但这不是重点):
public void SaveAllJockeys(List<LoadedJockey> allJockeys)
{
if (allJockeys.Count != 0)
{
if (File.Exists(_jockeysFileName)) File.Delete(_jockeysFileName);
try
{
using (StreamWriter file = File.CreateText(_jockeysFileName))
{
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(file, allJockeys);
}
}
catch (Exception e)
{
dialog.ShowDialog("Could not save the results, " + e.ToString(), "Error");
}
}
}
据我所知,在那段时间里,另一个任务正在向集合中添加新的集合项,它向我抛出了异常:
集合已修改;枚举操作可能无法执行。
正如我在THE ARTICLE 中阅读的那样,您可以更改迭代类型以避免异常。据我所知,无法修改方式,Newtonsoft.Jsonpack 是怎么做的。
提前感谢您提供有关如何避免异常并保存集合而不发生意外更改的任何提示。
【问题讨论】:
标签: c# json.net task jsonserializer