Metodproblem samt event problem C#

Permalänk

Metodproblem samt event problem C#

.

Permalänk
Medlem

Du skriver över objektet hamstersOut för varje iteration av loopen, så när du kör HamstersOut?.Invoke(...) skickar du alltid med den senaste hamstern.

Endera vill du trigga eventet för varje hamster och då ska du anropa Invoke inuti loopen, eller så vill du skicka med en lista av hamstrar till event-handlern som du sparar varje hamster till för varje iteration.

För övrigt tror jag att du gör dig själv en otjänst när du blandar in komplicerade koncept som trådning och lås med semaforer.
Se till att lära dig grunderna ordentligt först så kommer även det att bli enklare att lära dig senare.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Skrivet av noMad17:

Du skriver över objektet hamstersOut för varje iteration av loopen, så när du kör HamstersOut?.Invoke(...) skickar du alltid med den senaste hamstern.

Endera vill du trigga eventet för varje hamster och då ska du anropa Invoke inuti loopen, eller så vill du skicka med en lista av hamstrar till event-handlern som du sparar varje hamster till för varje iteration.

För övrigt tror jag att du gör dig själv en otjänst när du blandar in komplicerade koncept som trådning och lås med semaforer.
Se till att lära dig grunderna ordentligt först så kommer även det att bli enklare att lära dig senare.

Okejokej förstår, är detta en fullösning? Kallar på den i loopen o lägger till under gången sedan skickar jag med det i utskriften o nollställer listan?
Håller med, har en tendens att överarbeta saker när jag ser trevliga exemplen lite här och var, vilket oftast tenderar i att jag fastnar och får rätt jobbiga problem att lösa.

Permalänk
Medlem
Skrivet av PapaDiouf:

Okejokej förstår, är detta en fullösning? Kallar på den i loopen o lägger till under gången sedan skickar jag med det i utskriften o nollställer listan?
Håller med, har en tendens att överarbeta saker när jag ser trevliga exemplen lite här och var, vilket oftast tenderar i att jag fastnar och får rätt jobbiga problem att lösa.

Vilken den bästa lösningen är beror på vad du vill ska hända. Om du vill att ditt event ska köras en gång för varje hittad hamster kan du kalla på Invoke inuti loopen och skicka med nuvarande hamster. Ingen lista behövs i det fallet.

Vill du däremot bara trigga eventet en gång och skriva ut alla hamstrar som hittades måste dessa först sparas undan någonstans, lämpligtvis en lista. Då behöver du ändra HamstersOutOnExerciseAreaEventArgs så att den kan hålla en lista.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Skrivet av noMad17:

Vilken den bästa lösningen är beror på vad du vill ska hända. Om du vill att ditt event ska köras en gång för varje hittad hamster kan du kalla på Invoke inuti loopen och skicka med nuvarande hamster. Ingen lista behövs i det fallet.

Vill du däremot bara trigga eventet en gång och skriva ut alla hamstrar som hittades måste dessa först sparas undan någonstans, lämpligtvis en lista. Då behöver du ändra HamstersOutOnExerciseAreaEventArgs så att den kan hålla en lista.

Förstår! Skall testa detta lite, tack!
Sedan en annan fråga angående min metod, just nu hämtar jag alla hamstrarna, dock får hanar endast gå ut med hanar, och honor endast med honor, när jag försöker detta så går det okej fram tills att det endast är tre hanar kvar, då läggs 3 honor till i samma loop, just nu har jag bara testat att få till mitt event, tidigare försök har resulterat i det som jag beskrev precis. Hur kan jag köra detta så att endast hanarna släpps ut först, och när dom är klara, så körs honorna?

Permalänk
Medlem
Skrivet av PapaDiouf:

Förstår! Skall testa detta lite, tack!
Sedan en annan fråga angående min metod, just nu hämtar jag alla hamstrarna, dock får hanar endast gå ut med hanar, och honor endast med honor, när jag försöker detta så går det okej fram tills att det endast är tre hanar kvar, då läggs 3 honor till i samma loop, just nu har jag bara testat att få till mitt event, tidigare försök har resulterat i det som jag beskrev precis. Hur kan jag köra detta så att endast hanarna släpps ut först, och när dom är klara, så körs honorna?

Du får nog visa vad du har försökt. Vad jag ser gör du inget speciellt beroende på hamsterns kön i den kod du har klistrat in här.
Ett tips är två separata listor för hanar och honor.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Skrivet av noMad17:

Du får nog visa vad du har försökt. Vad jag ser gör du inget speciellt beroende på hamsterns kön i den kod du har klistrat in här.
Ett tips är två separata listor för hanar och honor.

Absolut! Skall testa att dela upp honor och hanar, återkommer med resultat!

Permalänk

.

Permalänk
Skrivet av PapaDiouf:

Okej, har testat lite här, inte riktigt kunnat se om det funkar som jag tänkt. Jag vill iaf att när hamstrarna anländer till dagis så ska jag efter en timme kolla om dom har varit ute, är deras "Activity" null så vill jag plocka ut dom 6 åt gången(eller mindre om det endast är färre kvar) och hane med hane och hona med hona. Såhär vill jag köra programmet(endast min test loop kommer se annorlunda ut sen):

for (int i = 0; i < 100; i++) { Console.WriteLine($"Time is {timeDiff}"); var timer = new System.Threading.Timer( e => mm.ThreadLetHamstersPlay(), null, TimeSpan.FromMilliseconds(10000), TimeSpan.FromMilliseconds(10000) ); if(timeDiff == DateTime.Now.Date.Add(new TimeSpan(16, 30, 0))) { Console.WriteLine("Done for today, time to go home!"); Console.ReadKey(); break; } timeDiff += TimeSpan.FromMinutes(6); Thread.Sleep(1000); }

Den här loopen skall simulera 10 timmar, timeDiff ökar med 6 minuter per varv och jag vill köra min metod varje timme liksom, den körs efter första timmen, dock inte andra vilket får mig att tänka att det är min metod det är fel på. Den kommer här:

lock (hamsterLock) { using(var db = new HamsterContext()) { int numberOfMaleHamstersOutOnExerciseArea = 0; int numberOfFemaleHamstersOutOnExerciseArea = 0; var availableSpaceInExerciseArea = db.ExerciseArea.Where(EA => EA.AvailableSpace == true).ToList(); var getMaleHamster = db.Hamsters.Where(H => H.Activity == null && H.Gender == "Male").ToList(); var getFemaleHamster = db.Hamsters.Where(H => H.Activity != null && H.Gender == "Female").ToList(); int maxLimit = availableSpaceInExerciseArea.Count <= getMaleHamster.Count ? availableSpaceInExerciseArea.Count : getMaleHamster.Count; for (int i = 0; i < maxLimit; i++) { if (getMaleHamster[i].Activity == null) { getMaleHamster[i].Activity = Program.timeDiff; availableSpaceInExerciseArea[i].AvailableSpace = false; getMaleHamster[i].ExerciseAreaID = availableSpaceInExerciseArea[i].ExerciseAreaID; PrintToConsole.getHamsters.Add(getMaleHamster[i]); numberOfMaleHamstersOutOnExerciseArea++; } db.SaveChanges(); } if(numberOfMaleHamstersOutOnExerciseArea > 0) { HamstersOut?.Invoke(this, new HamstersOutOnExerciseAreaEventArgs() { NumberOfHamstersOutOnExerciseArea = numberOfMaleHamstersOutOnExerciseArea }); } PrintToConsole.getHamsters = null; numberOfMaleHamstersOutOnExerciseArea = 0; maxLimit = availableSpaceInExerciseArea.Count <= getFemaleHamster.Count ? availableSpaceInExerciseArea.Count : getFemaleHamster.Count; for (int i = 0; i < maxLimit; i++) { if(getFemaleHamster[i].Activity == null) { getFemaleHamster[i].Activity = Program.timeDiff; availableSpaceInExerciseArea[i].AvailableSpace = false; getFemaleHamster[i].ExerciseAreaID = availableSpaceInExerciseArea[i].ExerciseAreaID; PrintToConsole.getHamsters.Add(getFemaleHamster[i]); numberOfFemaleHamstersOutOnExerciseArea++; } db.SaveChanges(); } if(numberOfFemaleHamstersOutOnExerciseArea > 0) { HamstersOut?.Invoke(this, new HamstersOutOnExerciseAreaEventArgs() { NumberOfHamstersOutOnExerciseArea = numberOfFemaleHamstersOutOnExerciseArea }); } PrintToConsole.getHamsters = null; numberOfFemaleHamstersOutOnExerciseArea = 0; } }

Juste, ser ju också att availablespace måste vara true också, det måste jag ändra nånstans också!

Permalänk
Medlem
Skrivet av PapaDiouf:

Okej, har testat lite här, inte riktigt kunnat se om det funkar som jag tänkt. Jag vill iaf att när hamstrarna anländer till dagis så ska jag efter en timme kolla om dom har varit ute, är deras "Activity" null så vill jag plocka ut dom 6 åt gången(eller mindre om det endast är färre kvar) och hane med hane och hona med hona. Såhär vill jag köra programmet(endast min test loop kommer se annorlunda ut sen):

for (int i = 0; i < 100; i++) { Console.WriteLine($"Time is {timeDiff}"); var timer = new System.Threading.Timer( e => mm.ThreadLetHamstersPlay(), null, TimeSpan.FromMilliseconds(10000), TimeSpan.FromMilliseconds(10000) ); if(timeDiff == DateTime.Now.Date.Add(new TimeSpan(16, 30, 0))) { Console.WriteLine("Done for today, time to go home!"); Console.ReadKey(); break; } timeDiff += TimeSpan.FromMinutes(6); Thread.Sleep(1000); }

Den här loopen skall simulera 10 timmar, timeDiff ökar med 6 minuter per varv och jag vill köra min metod varje timme liksom, den körs efter första timmen, dock inte andra vilket får mig att tänka att det är min metod det är fel på.

Det är med största sannolikhet inget i din metod som orsakar att den bara körs en gång.

Du får tänka efter lite här. Du skapar en loop som ska köra 100 iterationer och i varje iteration skapar du upp en ny timer som kör din metod var tionde sekund. Detta innebär alltså att du kommer ha 100 trådar som anropar din metod var tionde sekund (eller var elfte eftersom du också pausar huvudtråden i en sekund för varje iteration).

Det rimliga vore att endast skapa en enda timer som sedan använder timeDiff för att avgöra huruvida programmet ska avslutas.

Ett tips till dig är att börja smått och sedan skala upp när du har verifierat att det fungerar. Nu är det så mycket som händer att det är svårt att veta exakt vad som går fel. Om du börjar med att koda logiken för hamstrarna och verifierar att det fungerar så kan du gå vidare till nästa bit steg för steg. Allt det här med timers och databaser kan du vänta med, börja med hårdkodade värden och testa dig fram.

Visa signatur

AMD Ryzen 7 1700X 3.8 GHz 20MB | ASUS PRIME X370-PRO | MSI GeForce GTX 1080 Gaming X 8GB | G.Skill 16GB DDR4 3200 MHz CL14 Flare X | Corsair RM650x 650W

Permalänk
Skrivet av PapaDiouf:

Juste, ser ju också att availablespace måste vara true också, det måste jag ändra nånstans också!

Okej, har testat lite andra lösningar nu, ska göra klart metoden och återkommer imorrn, du kan skippa att kolla på det som ligger där så kommer det nytt!

Permalänk

.