并行编程 - 获取内部异常作为“对象引用未设置为对象的实例”
本文关键字:设置 对象 实例 对象引用 获取 内部 异常 并行 编程 | 更新日期: 2023-09-27 18:32:23
我正在对 4+ 个 XML 文件执行 100 个步骤的过程,并将它们写入特定位置。所以最初我使用一个 parallel.for 来获取每个文件,并且那个并行循环调用另一个 cs 文件中的方法。我的流程包括4个步骤。其中前 3 步是获取和修改具有某些条件的元素,第 4 步是将其写入一个位置。所以为此(仅第 4 步)我使用了一个锁,以便一次单个线程可以拥有文本编写器的权限。所以.1st 9 到 11 个文件处理而没有锁错误...之后,我得到一个对象引用未设置为对象的实例。 我使用并发字典和类对象来保存数据。该类对象在第 9 个文件之后显示为空...请给我一个解决这个问题的想法。
表单 1 中的并行循环.cs
XMLDEFN WebXML = new XMLDEFN();
DirectoryInfo dinfo = new DirectoryInfo(@"E:'XMLLIST");
FileInfo[] xmllist = dinfo.GetFiles("*.xml", SearchOption.AllDirectories);
int count1 = xmllist.Count();
object lockobj = new object();
Parallel.For(0, count1, i =>
{
WebXML.FileName = xmllist[i].ToString();
WebXML.Migrate(lockobj, i); //this call goes to the another Project CS file
});
项目2.migartor.cs
public override bool Migrate(object lockobj,int i)
{
ProcessContext();
ProcessTasks();
ProcessServices();
ProcessDataTransfer();
IncludeVersionInfo();
lock (lockobj)
{
Save(lockobj,i);
}
return true;
}
protected void Save(object lockobj,int i)
{
int a = i;
XmlSerializer xmlSerializer = new XmlSerializer(typeof(OBJ_M));
XmlSerializerNamespaces ns = null;
TextWriter txtWriter = null;
ns = new XmlSerializerNamespaces();
ns.Add("", "");
// Create an instance of stream writer.
txtWriter = new StreamWriter(@"d:'temp'" + OBJ.ILBOName + "_temp.xml");
xmlSerializer.Serialize(txtWriter, OBJ, ns);
// Close the stream writer
txtWriter.Close();
txtWriter = null;
xmlSerializer = null;
OBJ = null;
}
OBJ即将以空...oBJ带有一些10 +属性,这些属性在上述3个步骤中进行了更新。
您
正在创建一个新的 XmlSerializerNamespaces 对象并向该对象添加一个空名称spave。
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
根据 MSDN(链接在此处:http://msdn.microsoft.com/en-US/library/MS163161(v=vs.110).aspx),您创建一个测试,该测试在对象属性上运行,并将每个 evry 属性与 null 命名空间匹配。 这种场景的正确编写方式如下:
public class MyClass
{
[XmlElement(Namespace = "http://www.example1.com")]
public string sample1;
[XmlElement(Namespace = "http://www.example2.com")]
public string sample2;
//....
}
//...
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("prefix", "http://www.example2.com");
这显然不是你的情况...请像这样调用您的序列化方法:
xmlSerializer.Serialize(txtWriter, OBJ);