C#中Foreach循环未完成迭代:10条XML记录仅生成6个XML文件
问题分析与解决方案
核心问题1:文件名重复导致文件被覆盖
你的代码生成文件名时使用了DateTime.Now.ToString("yyyyMMddhhmmssfff"),但foreach循环执行速度极快,多条记录可能在同一毫秒内完成序列化,生成完全相同的文件名,后续文件会直接覆盖之前的,所以看起来只生成了部分文件,实际是被覆盖了。
核心问题2:空catch块吞掉异常
代码中的catch (Exception ex)块是空的,如果某条记录的Code或Description_1为null,调用ToString()会抛出空引用异常,循环会直接终止,但你完全看不到错误信息,无法排查问题。
修复步骤
生成唯一文件名
可以通过以下方式避免文件名重复:- 加入记录的唯一标识(比如
CODE):string fileName = $"C:\\Upload\\PRODUCT_{myProdSignalLoop.Code}_{DateTime.Now.ToString("yyyyMMddhhmmssfff")}.xml"; - 用Guid生成唯一后缀:
string fileName = $"C:\\Upload\\PRODUCT_{Guid.NewGuid()}.xml";
- 加入记录的唯一标识(比如
处理空引用,避免异常
对可能为null的字段做空值处理,比如:CODE = myProdSignalLoop.Code?.ToString().Trim() ?? string.Empty, SHORTDESC = myProdSignalLoop.Description_1?.ToString().Trim() ?? string.Empty,不要吞异常,添加日志或错误输出
把catch块改成能记录异常的形式,比如:catch (Exception ex) { // 写入日志文件或输出到控制台 File.AppendAllText("C:\\Upload\\error.log", $"[{DateTime.Now}] 处理记录失败: {ex.Message}\r\n{ex.StackTrace}\r\n"); }优化代码结构(可选)
XmlSerializer可以提前初始化,不用每次循环都创建,提升性能:// 将XmlSerializer移到循环外部 XmlSerializer xsSubmit = new XmlSerializer(typeof(erp_crm_class.PRODUCT)); foreach (kv_sp_Product_Result myProdSignalLoop in toProdSignlCRMList) { // ... 其余代码 }
内容的提问来源于stack exchange,提问作者TNC Noel
相关产品推荐
相关产品推荐

