并行编程 - 获取内部异常作为“对象引用未设置为对象的实例”

本文关键字:设置 对象 实例 对象引用 获取 内部 异常 并行 编程 | 更新日期: 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);