有人可以解释回调/事件触发

时间:2009-06-06 13:29:15

标签: events web-applications callback

在之前的SO问题中,建议我使用回调/事件触发而不是轮询。有人可以更详细地解释一下这一点,或许可以参考在线教程,这些教程展示了如何为基于Java的Web应用程序做到这一点。

感谢。

5 个答案:

答案 0 :(得分:12)

维基百科回调的定义是:

  

在计算机编程中,回调是   作为传递的可执行代码   其他代码的参数。它允许一个   较低级别的软件层来调用   a中定义的子程序(或函数)   更高层次。

在它的基本形式中,可以像这样使用回调(伪代码):

void function Foo()
{
   MessageBox.Show("Operation Complete");
}

void function Bar(Method myCallback)
{
  //Perform some operation
  //When completed execute the callback method
  myCallBack().Invoke();
}

static int Main()
{
   Bar(Foo); //Pops a message box when Bar is completed
}

像Java和c#这样的现代语言有一种标准化的方法,他们称之为事件。事件只是一个特殊类型的属性添加到一个类,其中包含一个Delegates / Method Pointers / Callbacks列表(这三个事情都是相同的。当事件被“触发”时,它只是迭代它的回调列表并执行它们。这些也被称为听众。

这是一个例子

public class Button
{
   public event Clicked;

   void override OnMouseUp()
   {
        //User has clicked on the button. Let's notify anyone listening to this event.
       Clicked(); //Iterates through all the callbacks in it's list and calls Invoke();
   }
}

public class MyForm
{
   private _Button;

   public Constructor()
   {
       _Button = new Button();

      //Different languages provide different ways of registering listeners to events.
      // _Button.Clicked += Button_Clicked_Handler;
      // _Button.Clicked.AddListener(Button_Clicked_Handler); 
   }

   public void Button_Clicked_Handler()
   {
       MessageBox.Show("Button Was Clicked");
   }
}

在此示例中,Button类有一个名为Clicked的事件。它允许任何想要在被点击时收到通知的人注册回调方法。在这种情况下,“Button_Clicked_Handler”方法将由Clicked事件执行。

当您需要通知程序中其他地方发生了某些事情并且您不知道何时或如何发生这种情况时,事件/回调体系结构非常方便。

这大大简化了通知。轮询使其变得更加困难,因为您有责任经常检查操作是否已完成。一个简单的轮询机制就是这样:

static void CheckIfDone()
{
    while(!Button.IsClicked)
    {
       //Sleep
    }

    //Button has been clicked.
}

问题是这种特殊情况会阻止你现有的线程,并且必须继续检查,直到Button.IsClicked为真。关于事件体系结构的好处是它是异步的,让代理项(按钮)在完成时通知监听器而不是监听器必须继续检查,

答案 1 :(得分:4)

轮询和回调/事件之间的区别很简单:

  • 轮询:如果某些条件符合要求,您会连续或每隔一段时间询问,例如,如果某个键盘按键被按下了。
  • 回调:您对某些驱动程序,其他代码或其他内容说:当某些事情发生时(在我们的示例中已经按下键盘),调用此函数,然后传递它在事件发生时要调用的函数。通过这种方式,您可以“忘记”该事件,并知道它会在发生时正确处理。

答案 2 :(得分:2)

回调是指当您关心的事情发生时传递要调用/通知的函数/对象。这在UI中被大量使用 - 例如,只要按下按钮,函数就会传递给按钮。

答案 3 :(得分:1)

此方案涉及两名参与者。首先,你有“观察”,不时做其他玩家感兴趣的事情。这些其他球员被称为“观察者”。 “观察”可能是一个计时器,“观察者”可能是任务,对报警事件感兴趣。

这种“模式”在Gamma,Helm,Johnson和Vlissides的“Design Patterns,Elements of Reusable Object-Oriented Software”一书中有所描述。

两个例子:

  1. 用于解析XML遍历的SAX解析器 通过XML文件并引发事件 每次遇到一个元素。 听众可以听这些 元素并用它做点什么。
  2. Swing和AWT就是基于此 图案。当用户移动时 鼠标,点击或输入内容 键盘,这些动作都是 转化为事件。用户界面 组件听这些
  3. 事件并对他们作出反应。

答案 4 :(得分:1)

通过事件通知几乎总是优于轮询,尤其是涉及硬件且该事件源自发出CPU中断的驱动程序时。在这种情况下,当你等待一些硬件完成任务时,你根本就没有使用任何cpu。