Avatar billede gadensgaard Nybegynder
19. september 2011 - 20:29 Der er 6 kommentarer og
1 løsning

Eksekvere metoder på child threads?

Hej eksperter?

Hvordan eksekverer jeg metoder på objekter der eksisterer på child threads?

Jeg har en main thread hvorfra jeg starter X antal tråde (af samme metode). I hver tråd instantieres et object der har en instansmetode.

Hvordan kan jeg senere tilgå child tråden og eksekvere en metode på det objekt der kun eksisterer lokalt i tråden?

Jeg har forsøgt med et event som vist nedenfor, problemet er bare at det altid er main tråden jeg får fat i. Button1 starter en ny tråd og button2 fyrer et event. Når eventet fyrer skal listeners gøre et eller andet med objektet og udskrive deres trådID i en messagebox.

Når eventet fyrer (efter nye tråde er startet) er det alligevel kun main tråden der eksekverer koden og der sker derfor intet med objektet (da det jo kun eksisterer lokalt i de enkelte tråde).

Hvad overser jeg? Og er der en nemmere måde at gøre det på?

På forhånd tak

public class Main
{


  //event delegate
  public delegate void AddClientEventHandler();

  //event
  public event AddClientEventHandler ClientAdded;

  void StartThread()
  {

    Object object = new Object();

    //event listener
    this.ClientAdded += new AddClientEventHandler(delegate(){
      object.doWhatever();
      MessageBox.Show(Thread.CurrentThread.ManagedThreaId.toString())
    });

  }
       
  private void Button1_Click(object sender, EventArgs e)
  {
    Thread thread = new Thread(StartThread);
    thread.Start();
  }

  private void Button2_Click(object sender, EventArgs e)
  {
    if(this.ClientAdded != null)
      this.ClientAdded();
  }     
}
Avatar billede gadensgaard Nybegynder
19. september 2011 - 20:43 #1
Hov, jeg havde egentlig tænkt mig at give 200 points, jeg fik trykket opret lidt for tidligt. Det finder vi ud af.
Avatar billede bvli Praktikant
19. september 2011 - 20:49 #2
Øh? Du kalder jo også kun din delegate fra din main-thread?

Men altså - du blander vist det hele lidt sammen. Det er ligemeget hvilken tråd du har oprettet instansen i. Det er i det context hvor kaldet bliver afviklet der er interessant (Og du kalder den fra din knap2's eventhandler).

Du kunne evt. lade din tråd lytte på en kø, hvorpå du lægger Tasks til afvikling. (eller bare instanser af delegates) Men det er stadig en lappeløsning.

Har du prøvet at kigge på: System.Threading.Tasks namespacet?
Avatar billede gadensgaard Nybegynder
19. september 2011 - 21:06 #3
Hej bvli og tak for svar

Jeg har garanteret blandet det hele sammen, jeg har ikke arbejdet med threads og events tidligere.

Jeg har ikke kigget på tasks nej, det vil jeg gøre. Men du siger at det er en lappeløsning, og jeg vil egentlig hellere gøre det "rigtigt".

Hvad vil du foreslå hvis jeg gerne vil køre en metode på et objekt i tråden?
Avatar billede bvli Praktikant
19. september 2011 - 21:22 #4
Er det et længerevarende kald du skal afvikle? For ellers kunne du jo bare bede ThreadPool'en om at gøre det for dig.


private void MyMethod() {
  Console.WriteLine("Hello from: " + Thread.CurrentThread.ManagedThreadId);
}


private void Button2_Click(object sender, EventArgs e)
{
  ThreadPool.QueueUserWorkItem(new WaitCallback(MyMethod));
}

--

Der er også en overload, som tager en parameter, hvis din metode skulle have brug for det.

Men ellers, så kig på Tasks - det er vejen at gå fremover.
Avatar billede gadensgaard Nybegynder
19. september 2011 - 21:44 #5
Det ser ud til at være det jeg har behov for. Specifikt har jeg behov for at tilføje et element til en liste på objektet.

Jeg kigger lige nærmere på det imorgen, så vender jeg tilbage. Tak indtil videre.
Avatar billede gadensgaard Nybegynder
20. september 2011 - 20:38 #6
Nå, jeg endte med at gå en helt anden vej for at få det til at fungere som jeg ønsker.

Tak for hjælpen alligevel.

Smid et svar for din tid.
Avatar billede bvli Praktikant
20. september 2011 - 21:45 #7
Alt Ok
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