обратный вызов / делегат? - PullRequest
0 голосов
/ 06 августа 2011

У меня есть сомнения ..

Я хотел бы создать функцию, и она будет выглядеть следующим образом ...

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();

    }
}

В «Классе A» мы будем вызывать событиеили около того, и он будет отображать форму окна для пользователя, а затем пользователь будет вводить некоторое значение, и нам нужно вернуть это значение в класс A -> метод dowork .... тогда только мы должны продолжить "работа 2"

это также должно поддерживать многопоточность ... у кого-нибудь есть идеи, как мы можем реализовать это ??

спасибо:)

1 Ответ

0 голосов
/ 08 августа 2011

Вы можете использовать ManulResetEvent для этой цели: Вы запускаете свою форму ввода, а когда она это делает, задаете событие, чтобы вы могли его перехватить из метода A.dowork. Во время ввода в действии вы запускаете бесконечный цикл, проверяете состояние события и обрабатываете событие приложения, чтобы за это время приложение стало ответственным:

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();
  }
}

Кроме того, я предлагаю вам (если вы можете) использовать библиотеку Async (она доступна в качестве отдельной установки). Там вы можете реализовать это гораздо проще:

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();
  }
}

Как вы видите, вы просто ждете, пока другой фрагмент кода будет выполнен без какой-либо блокировки пользовательского интерфейса и событий. Я могу предоставить более глубокое объяснение того, как асинхронизация / ожидание работает здесь, если вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...