windows - tilbagekaldelse/delegeret?

Indlæg af Hanne Mølgaard Plasc

Problem



jeg tvivler..


Jeg vil gerne oprette en funktion, og det vil se sådan ud ...


public class A        //this is just a class file
{
    function dowork()
    {
        //work 1

        INPUT = here in this line it should call a delegate function or raise event etc...

        //work 2 using INPUT
    }
}

public class B
{
    function myfn()
    {
        A objA = new A();
        objA.dowork();

    }
}


I 'Klasse A' vil vi rejse event eller så & det vil vise en Windows-formular til bruger og derefter brugeren vil indtaste en værdi og amp; vi skal returnere den værdi til klasse A -> dowork metode .... så skal vi kun fortsætte 'arbejde 2'


dette bør også understøtte multi threading ... nogen har en ide om, hvordan vi kan gennemføre dette ??


tak :)

Bedste reference


Du kan bruge ManulResetEvent til dette formål: Du kører din indtastningsformular, og når den er færdig, skal du indstille begivenheden, så du kan fange den fra A.dowork-metoden. Mens input i handling du kører uendelig sløjfe, tjek begivenhedstilstand og behandle applikationsbegivenhed for at gøre appen ansvarlig i denne tid:


public class A        //this is just a class file
{
  private ManualResetEvent \_event;

  public void dowork()
  {
    //work 1

    \_event = new ManualResetEvent(false);
    //INPUT = here in this ...
    Worker worker = new Worker();
    worker.DoInput(\_event);

    while(true)
    {
      if(\_event.WaitOne())
        break;
      Application.DoEvents();
    }

    //work 2 using INPUT
  }
}

class Worker
{
  private ManualResetEvent \_event;

  public void DoInput(ManualResetEvent @event)
  {
    \_event = @event;

    // Show input form here. 
    // When it done, you call: \_event.Set();
  }
}


Jeg foreslår også dig (hvis du kan) bruge Async bibliotek (det er tilgængeligt som en selvstændig opsætning). Der kan du implementere det på meget mere ligetil måde:


public class A        //this is just a class file
{
  public async void dowork()
  {
    //work 1

    //INPUT = here in this ...
    Worker worker = new Worker();
    wait worker.DoInput();

    //work 2 using INPUT
  }
}

class Worker
{
  public async void DoInput()
  {
    InputForm form = new InputForm();
    wait form.ShowInput();
  }
}

public class B
{
  async void myfn()
  {
    A objA = new A();
    wait objA.dowork();
  }
}


Som du ser, skal du bare vente mens andet stykke kode udføres uden UI-låsning og begivenheder.
Jeg kan give en dybere forklaring på, hvordan async/vent fungerer her, hvis du har brug for det.