?
Solved

C# XmlTextReader gets: The thread XXXX has exited with code 259 (0x103).

Posted on 2014-11-07
7
Medium Priority
?
2,220 Views
Last Modified: 2014-11-21
Hi Experts,

I'm trying to learn ASP.net/C# and have run into an issue I'm not able to solve myself.

I'm trying to seed a list of Postal Codes into my own DB from a publicly available XML file - but when I try to run the seed, it is incredibly slow - and I randomly receive an "The thread XXXX has exited with code 259 (0x103)."

I've added some Debug statements to test if the data received is valid, and it is actually adding the data to my local DB.

What might be causing this performance issue? And what might be a better solution? (see code below)

Best regards
Ian

My code so far:
----------------------------------------------------------------
        public ActionResult Seed()
        {
            ApplicationDbContext db = new ApplicationDbContext();

            var postalCodes = new List<PostalCode>();

            String URLString = "http://geo.oiorest.dk/postnumre.xml";

            XmlTextReader reader = new XmlTextReader(URLString);


            int fra = 0;
            int til = 0;
            String navn = "";

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "postnummer")
                {
                    reader.ReadToDescendant("fra");
                    fra = reader.ReadElementContentAsInt();
                    reader.MoveToContent();
                    til = reader.ReadElementContentAsInt();
                    Debug.WriteLine("fra: " + fra + " til: " + til);
                    reader.MoveToContent();
                    navn = reader.ReadElementContentAsString();
                    Debug.WriteLine(navn);

                    if (til > fra)
                    {
                        for (int i = 0; i <= til - fra; i++)
                        {
                            String postnr = "" + (fra + i);
                            Debug.WriteLine(postnr);
                            postalCodes.Add(new PostalCode { City = navn, PostalCodeTxt = postnr });
                        }

                    }
                    else
                    {
                        postalCodes.Add(new PostalCode { City = navn, PostalCodeTxt = "" + fra });
                    }

                    foreach (var temp in postalCodes)
                    {
                        db.PostalCodes.Add(temp);
                    }


                    db.SaveChanges();



                }

            }


            return RedirectToAction("Index");
        }
0
Comment
Question by:imfpalne
  • 4
  • 3
7 Comments
 
LVL 36

Expert Comment

by:ste5an
ID: 40428584
I would use the built-in serializer:

1

Download the file to your development system. Store it e.g. under C:\Temp.

2

Open the Developer Command Prompt for VS2013.

3

In the prompt, goto C:\Temp (or where you saved your XML).

4

Run xsd postnumre.xml

5

Run xsd postnumre.xsd /classesDeveloper prompt and XSD

6

Create a new project or open an existing one.

7

Add the file created in step 5 to your solution.Solution explorer

8

Use the built-in deserializer.
namespace Samples
{
    using System;
    using System.Xml;
    using System.Xml.Serialization;

    public class Sample
    {
        public static void Main(string[] args)
        {
            const string URL = "http://geo.oiorest.dk/postnumre.xml";
            using (XmlTextReader reader = new XmlTextReader(URL))
            {
                XmlSerializer x = new XmlSerializer(typeof(postnumre));
                postnumre p = (postnumre)x.Deserialize(reader);
                foreach (postnumrePostnummer pn in p.Items)
                {
                    Console.WriteLine(string.Format("nr={0}, href={1}, navn={0}", pn.nr, pn.href, pn.navn));
                }
            }

            Console.ReadLine();
        }
    }
}

Open in new window


When the error still occours, then download the file separatly, before feeding it into the deserialization.

And don't forget to add exception handling.
0
 

Author Comment

by:imfpalne
ID: 40428663
Thank you for your reply ste5an, however I would prefer a solution that would allow me to update my own data from an API kind of XML feed - I know that there is rarely changes to a list of Postal Codes, however should that happen, I take it that your solution would require me to re-download and serialize the XML - am I correct?
0
 
LVL 36

Expert Comment

by:ste5an
ID: 40428732
Yes, you are. But it doesn't matters.

Cause your manual XML processing makes also assumptions to the XML file used. The only difference is that in this case it is sufficient to display it in a browser (download) and code the necessary steps (recreate postnumre.cs). So you're basically doing the same, just using different techniques.

But the solution would imho be the same, just download the entire file before processing it.
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:imfpalne
ID: 40443929
Hi Ste5an, I've tried your solution - and it works. However, it's not the solution I'm after, let's say I was retrieving data from an XML source that was updated twice a week. With your method, I would have to manually download and prepare the XML file twice a week (assuming that I actually know the update cycle even..) - I need a way to dynamically call the XML whenever I choose to, check my "local" DB to see if there are any changes, and then update my local DB with the changes.

As I found out - the source also offers jSon data if that makes it any easier?
0
 
LVL 36

Expert Comment

by:ste5an
ID: 40444655
Maybe, when it solves your problem.
0
 

Accepted Solution

by:
imfpalne earned 0 total points
ID: 40446426
I eventually found this thread, which has the exact answer to my question:

http://www.experts-exchange.com/Programming/Languages/.NET/ASP.NET/Q_22739861.html

Ste5an, thanks for trying.
0
 

Author Closing Comment

by:imfpalne
ID: 40456957
The answer in this thread is exactly what I was looking for - it speeds up the proces by loading the entire XML to a String and then process the string with xmlreader.read(String)
0

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Problem Hi all,    While many today have fast Internet connection, there are many still who do not, or are connecting through devices with a slower connect, so light web pages and fast load times are still popular.    If your ASP.NET page …
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
Is your OST file inaccessible, Need to transfer OST file from one computer to another? Want to convert OST file to PST? If the answer to any of the above question is yes, then look no further. With the help of Stellar OST to PST Converter, you can e…
How to fix display issue, screen flickering issue when I plug in power cord to the machine. Before I start explaining the solution lets check out once the issue how it looks like after I connect the power cord. most of you also have faced this…
Suggested Courses
Course of the Month7 days, 23 hours left to enroll

615 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question