C# 并行编程获得内部异常“对象引用未设置为对象实例”
我正在使用100多个XML文件执行4个步骤的过程,并将它们写入特定位置。 最初,我使用parallel.for来获取每个文件和调用另一个cs文件中的方法的并行循环。我的过程包括4个步骤。其中前3个步骤是获取和修改元素,带有一些条件,第4个步骤是将其写入一个位置。因此,仅在第4个步骤中,我就使用了锁,因此,一个线程可以同时拥有text writer..So.1st 9到11文件的权限,而不会出现带锁的错误…之后,我将获得一个未设置为对象实例的对象引用。。 我使用了并发字典和类对象来保存数据..类对象在第9个文件之后为空。。。 请给我一个解决这个问题的办法 //Form1.cs中的并行循环C# 并行编程获得内部异常“对象引用未设置为对象实例”,c#,task-parallel-library,nullreferenceexception,C#,Task Parallel Library,Nullreferenceexception,我正在使用100多个XML文件执行4个步骤的过程,并将它们写入特定位置。 最初,我使用parallel.for来获取每个文件和调用另一个cs文件中的方法的并行循环。我的过程包括4个步骤。其中前3个步骤是获取和修改元素,带有一些条件,第4个步骤是将其写入一个位置。因此,仅在第4个步骤中,我就使用了锁,因此,一个线程可以同时拥有text writer..So.1st 9到11文件的权限,而不会出现带锁的错误…之后,我将获得一个未设置为对象实例的对象引用。。 我使用了并发字典和类对象来保存数据..类对
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
});
Project2.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对象,并向该对象添加一个空名称
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
根据此处链接的msdn:您进行了一个测试,该测试在对象属性上运行,并将每个和evry属性与空名称空间相匹配。这种情景的正确写法如下:
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);
旁注:你的键盘有问题。。。请检查班次是否卡住……如果没有合理的样本显示问题,就无法提出任何建议。请编辑您的帖子,并添加示例来演示这个问题。您的并行。对于,它看起来无法真正工作。。。FileName属性的状态如何?几乎所有NullReferenceException的情况都是相同的。请参阅以获取一些提示。OBJ未定义。相关代码不存在。这是无法回答的。正在关闭。更改Serialize方法,没有给出任何+ve结果..仍然得到相同的错误..并且代码与正常的foreach一起工作正常。添加Parallel.foreach和Lock会引发错误..有什么建议吗?您正在并行循环中使用单个对象“WebXM”。。。更改WebXML.FileName时,属性会在调用WebXML.Migrate.之前切换值。。尝试使用一个nethod迁移,它将文件名作为一个参数。不起作用。还有其他建议吗?