Avatar billede flash1 Nybegynder
25. januar 2009 - 14:13 Der er 6 kommentarer og
2 løsninger

Hjælp til threads

Jeg er i tvivl om hvordan jeg skal benytte tråde på den bedste måde.

Jeg har en metode, som henter nøgle-værdier fra regDatabasen ud fra en pc på netværket. Dette vil jeg gerne gøre på alle pc'er på netværket. dvs. omkring 1000 pc'er.

Har prøvet med en foreach som for hver enkelt pc, starter en tråd fra threadpool, der kalder metoden og henter værdierne fra regDatabasen fra pc'en. (har prøvet at benytte monitor og lock på metoden, men uden held)

Det har virket tildels, men har haft problemer med at trådene blander data sammen og jeg derfor ikke altid for det rigtige resultat ud.


Så mit spørgsmål er: Hvordan bygger jeg det bedst op og sørger for at låse metode/tråde rigtigt?
Avatar billede Syska Mester
25. januar 2009 - 21:53 #1
Kom med noget kode ... så er det måske nemmere at se hvor det går galt ...

Specielt hvsi du kan lave det simple ... men hvor fejlen stadig opstår.

// ouT
Avatar billede flash1 Nybegynder
26. januar 2009 - 09:17 #2
Har forsøgt, at skære det overflødige fra. pt. er der ikke nogen lock/monitor i koden.


foreach (string PcNavn in listPc)
{
  ThreadPool.QueueUserWorkItem(new WaitCallback(RegistrerPrintere), PcNavn);
}

private void RegistrerPrintere(object PcNavn)
{
  if (reply.Status == IPStatus.Success)
  {
      pc = RegMgr.ReadPcInfo((string)PcNavn);

      pcID = SqlMgr.AddPc(pc.Navn, pc.Afdeling, pc.Rumnr);
  }
}

public PcInfo ReadPcInfo(string navn)
{
  pc = new PcInfo();
  registryKey = @"SOFTWARE\capasystems\CapaPC";
  SysRegistry = new Registry.RegistryRemote("user", "pw", "doamin", navn);               
           
  pc.Afdeling = SysRegistry.GetValue(Registry.baseKey.HKEY_LOCAL_MACHINE, registryKey,    "Afdeling", Registry.valueType.STRING);
 
  pc.Rumnr = SysRegistry.GetValue(Registry.baseKey.HKEY_LOCAL_MACHINE, registryKey, "Rumnr",    Registry.valueType.STRING);

  return pc;
}
Avatar billede flash1 Nybegynder
26. januar 2009 - 11:44 #3
Så fik jeg endelig tid til, at få afprøvet lidt af det jeg havde fået læst i weekenden og det ser sørme ud til, at det virker.

http://www.yoda.arachsys.com/csharp/threads/locking.shtml
Avatar billede flash1 Nybegynder
26. januar 2009 - 15:12 #4
Desværre var alt ikke så godt, som jeg troede. Det virker, men det er ikke alle tråde, som aflæser en værdi fra regDB og returnere derfor bare værdien "Blev ikke fundet."

Det er sjældent de samme pc'er og virker derfor meget tilfældigt. Det kører fint, hvis jeg lader formen køre dem alle igennem en for en.
Avatar billede Syska Mester
26. januar 2009 - 15:32 #5
hmmm ...

Læste lige lidt om ThreadPool.
http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

De skriver 256 per processor. så med mindre du har en quad core, så må der vel gå noget galt der ...

Lader heller ikke til at den kører flere ting på samme tid ... bare mere at den automatisk venter ... jeg synes ikke lige jeg kan blive klog på den klasse.

men hvorfor ikke selv starte X antal processor og når den er færdig ... så kigge i en kø og tage et workitem ud ... og process det.

http://www.eksperten.dk/spm/860441 - min tråd om næsten noget ala det samme ... bare med download ... kom til at virke 10000 gange bedre end med den indbyggede Async download ... som WebClient har.

En ide ... men lad mig høre hvad du når frem til.

// ouT
Avatar billede flash1 Nybegynder
27. januar 2009 - 14:44 #6
Så vidt jeg ved så sørger threadpoolen selv for at starte nye processer når andre afsluttes. Så om den starter 250, 500 eller 1000 på engang; så skal de alle nok blive kørt.

Har fået løst problemet ved at lave et check på hvilken værdi der returneres.
Avatar billede flash1 Nybegynder
27. januar 2009 - 14:45 #7
bare lige et svar. så får du også lidt for ulejligheden.
Avatar billede Syska Mester
27. januar 2009 - 16:12 #8
svar.

Ja ... men tænkte mere på hvordan den starte de tråde ... da den jo også laver connections ud ... og du siger 1000 computere ... det er jo sådan måske lidt sygt mange connections at starte på samme tid.

Jeg synes ikke helt jeg kunne funde ud af hvordan den kører ... og om den først springer til ny tråd når den venter på et eller andet i en anden tråd ...

// ouT
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

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