Avatar billede nickbuus Nybegynder
13. maj 2007 - 20:51 Der er 6 kommentarer og
1 løsning

arraylist indhold forsvinder når kaldt fra anden tråd

I nedenstående klasse - kalder jeg fra en tråd "Write" metoden og placerer en række arraylists inden i outputArray arraylisten. problemet er så at når jeg bagefter kalder GetOutputArray fra main tråden indeholder den kun et outputarray med en række indre arraylists som alle er tomme - jeg har prøvet at sætte et breakpoint på write metoden og når den bliver kaldt indeholder (arrRipped) altid data - hvad går galt?


ArrayList outputArray = new ArrayList();
     
        public override void Write(ArrayList arrRipped)
        {
            outputArray.Add(arrRipped);'
                  }
        public ArrayList GetOutputArray()
        {
            return  outputArray;
        }
Avatar billede dr_chaos Nybegynder
13. maj 2007 - 21:04 #1
din arraylist bliver initialiseret på ny hvergang den indeholdende klasse bliver istantieret.
Du kan evt prøve at læse mere om singleton design pattern som måske kan løse dit problem.
Avatar billede nickbuus Nybegynder
14. maj 2007 - 08:03 #2
klassen bliver kun initialiseret en gang - hvorefter write metoden kaldes x antal gange - det er ikke problemet - outputArray indeholder jo også 10 inner arraylists for eks. de gange write metoden er kaldet - de er bare alle tomme når getoutputarray kaldes - dvs. count er 40 på outputarray - men arraylistene (arrRipped) er tomme
Avatar billede aaberg Nybegynder
14. maj 2007 - 09:06 #3
Det er helt sikkert ikke denne klasse der er problemet. Jeg synes det lyder som om, at din fejl ligger der, hvor du kalder Write metoden. Når du kalder write metode, initialisere du da arrRipped forfra for hver kald? Hvis du ikke gør det, vil alle arrRiped referenserne i dit outputArray pege på samme instans.

Kan du poste koden som kalder Write metoden?
Avatar billede nickbuus Nybegynder
14. maj 2007 - 10:03 #4
jeg fandt en løsning -Jeg ændrede dataState.OneRowList til
(ArrayList)dataState.OneRowList.Clone()
det hjalp - i kan dele pointene for at hjælpe mig på sporet - læg et svar og tak for hjælpen.
Kan i evt. fortælle om det er nødvendigt at sætte lock omkring write metoden
Avatar billede nickbuus Nybegynder
14. maj 2007 - 10:04 #5
dataState.Writer.Write((ArrayList)dataState.OneRowList.Clone()); - sådan ser den ud - herfra kaldes Write metoden...
Avatar billede aaberg Nybegynder
14. maj 2007 - 11:55 #6
Jeg tror ikke du behøver at sætte lock om din write metode. Det er ikke farligt hvis der er to tråde der prøver at læse og skrive på samme tid. Hvis der er noget kode inde i ArrayList.Add, som kræver speciel behandling ved multithreading, så vil jeg tro at Microsoft har sørget for at implementere det.

Kun brug lock hvis du har en god grund til det, da du risikere deadlock fejl, som kan være næsten umulige at finde.
Avatar billede nickbuus Nybegynder
15. maj 2007 - 09:04 #7
du får pointene aaberg80
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