回调/委托?

时间:2011-08-05 20:08:32

标签: windows winforms callback

我怀疑......

我想创建一个函数,它看起来像这样......

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 :(得分:0)

您可以使用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();
  }
}

如您所见,只是等待其他代码段执行而没有任何UI锁定和事件。 如果需要,我可以提供有关异步/等待如何工作的更深入的解释。