Avatar billede superzapper Nybegynder
03. marts 2006 - 17:20 Der er 12 kommentarer og
1 løsning

Synchronize XmlDocument.Load

Hejsa,

jeg er ved at lave en class der skal læse et xml dokument og så indeholder det metoder til at hente elementer fra dokumentet.

Mit problem er at webapplikationen crasher hvis flere tråde skaber objekter af klassen samtidig, da de så prøver at læse i xml-filen samtidigt.

Jeg har prøvet at sætte lock(xmlDoc){} udenom der hvor jeg kalder load, men det hjælper ikke. Jeg har også prøvet at lave min class som en singleton og (også liggende i Application["bla"]) men lige meget hjælper det..

Er der nogen der har prøvet noget lignendene og har fundet en løsning??
Avatar billede superzapper Nybegynder
03. marts 2006 - 17:21 #1
Sådan ser constructoren ud hvis det er nogen hjælp....

public Language(string group, string language)
    {
       
        doc = new XmlDocument();
        try
        {
            doc.Load(HttpContext.Current.Server.MapPath(string.Format("App_Data/language/{0}/{1}.xml", language, group)));
        }
        catch (Exception ex)
        {
            throw ex;
        }           
    }
Avatar billede arne_v Ekspert
03. marts 2006 - 17:42 #2
private static object lo = new object();
public Language(string group, string language)
    {
     
        doc = new XmlDocument();
        try
        {
lock(lo)
{            doc.Load(HttpContext.Current.Server.MapPath(string.Format("App_Data/language/{0}/{1}.xml", language, group)));
}
        }
        catch (Exception ex)
        {
            throw ex;
        }         
    }

burde sikre at der kun er en traad som laeser
Avatar billede superzapper Nybegynder
03. marts 2006 - 18:00 #3
private static object lo = new object();

    public Language(string group, string language)
    {
       
        doc = new XmlDocument();
        try
        {
            lock (lo)
            {
                doc.Load(HttpContext.Current.Server.MapPath(string.Format("App_Data/language/{0}/{1}.xml", language, group)));
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }           
    }

Giver stadig en fejl... Får en null reference på et tidspunkt hvis jeg sætter den til at spawne 100 tråde som hver skaber et objekt...
Avatar billede superzapper Nybegynder
03. marts 2006 - 18:10 #4
for (int i = 0; i < 2; i++)
        {
          ThreadStart ts = new ThreadStart(WriteText);
          Thread t = new Thread(ts);
          t.Start();         
        }



public static void WriteText()
    {
        Language language = new Language("GruppeNavn", "Danish");
                     
        s += language.GetText("MinTekst");
       
        s += language.GetText("MinTekst2");
       
        s += language.GetText("MinTekst3");
       
        s += language.GetText("MinTekst4");
       
        s += language.GetText("MinTekst5");         
    }

er det jeg bruger til testen... Den kører 2-3 gange igennem men så fejler den også med et brag på en null reference i try blokken i constructoren...
Avatar billede superzapper Nybegynder
03. marts 2006 - 18:25 #5
Hmm den havde jeg ikke lige luret.. Det er sq HttpContext.Current der er null?? Meget mystisk - skal man synchronize den eller noget?!
Avatar billede arne_v Ekspert
03. marts 2006 - 18:32 #6
HttpContext kan vel ikke bruges i seperate traade !?!?
Avatar billede arne_v Ekspert
03. marts 2006 - 18:35 #7
HttpContext.Current
Avatar billede arne_v Ekspert
03. marts 2006 - 18:35 #8
lock'en skal virke
Avatar billede arne_v Ekspert
03. marts 2006 - 18:36 #9
men send da filnavnet over som argument i constructor til det objekt du koerer i
traaden
Avatar billede superzapper Nybegynder
03. marts 2006 - 18:38 #10
Ja, det er nok det jeg skal... Men takker for hjælpen... Smid et svar...
Avatar billede superzapper Nybegynder
03. marts 2006 - 18:41 #11
Hmm testen var egentlig for at se om det ville brage ned ved flere requests... Men det kan jo faktisk godt tænkes at det virker fint nok under de omstændigheder...
Avatar billede arne_v Ekspert
03. marts 2006 - 18:48 #12
jeg ville nok teste det med en aegte ASP.NET side og saa en multithreaded
client app der fyrede 100000 requests af i 100 traade med HttpWebRequest klassen
Avatar billede arne_v Ekspert
03. marts 2006 - 18:49 #13
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester