C# 并行编程获得内部异常“对象引用未设置为对象实例”

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文件的权限,而不会出现带锁的错误…之后,我将获得一个未设置为对象实例的对象引用。。 我使用了并发字典和类对象来保存数据..类对

我正在使用100多个XML文件执行4个步骤的过程,并将它们写入特定位置。 最初,我使用parallel.for来获取每个文件和调用另一个cs文件中的方法的并行循环。我的过程包括4个步骤。其中前3个步骤是获取和修改元素,带有一些条件,第4个步骤是将其写入一个位置。因此,仅在第4个步骤中,我就使用了锁,因此,一个线程可以同时拥有text writer..So.1st 9到11文件的权限,而不会出现带锁的错误…之后,我将获得一个未设置为对象实例的对象引用。。 我使用了并发字典和类对象来保存数据..类对象在第9个文件之后为空。。。 请给我一个解决这个问题的办法

//Form1.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

});
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迁移,它将文件名作为一个参数。不起作用。还有其他建议吗?