Events 有人能解释一下回调/事件触发吗

Events 有人能解释一下回调/事件触发吗,events,web-applications,callback,Events,Web Applications,Callback,在前面的SO问题中,建议我使用回调/事件触发而不是轮询。有人能更详细地解释一下这一点吗?也许可以参考一些在线教程,说明如何为基于Java的web应用程序实现这一点 谢谢。回调是当您传递函数/对象以在它关心的事情发生时被调用/通知。这在UI中经常使用-例如,一个函数被传递给一个按钮,该按钮在按下按钮时被调用。回调是指当您传递一个函数/对象以在它关心的事情发生时被调用/通知。这在UI中经常使用-例如,一个函数被传递给一个按钮,该按钮在按下按钮时被调用。在这个场景中涉及到两个玩家。首先,你可以观察到一

在前面的SO问题中,建议我使用回调/事件触发而不是轮询。有人能更详细地解释一下这一点吗?也许可以参考一些在线教程,说明如何为基于Java的web应用程序实现这一点


谢谢。

回调是当您传递函数/对象以在它关心的事情发生时被调用/通知。这在UI中经常使用-例如,一个函数被传递给一个按钮,该按钮在按下按钮时被调用。

回调是指当您传递一个函数/对象以在它关心的事情发生时被调用/通知。这在UI中经常使用-例如,一个函数被传递给一个按钮,该按钮在按下按钮时被调用。

在这个场景中涉及到两个玩家。首先,你可以观察到一些其他玩家感兴趣的事情。这些其他玩家被称为观察员。观察者可以是计时器,观察者可以是任务,对报警事件感兴趣

Gamma、Helm、Johnson和Vlissides的《设计模式、可重用面向对象软件的元素》一书中描述了这种模式

两个例子:

用于解析XML的SAX解析器 通过XML文件并引发事件 每次遇到元素时。 听众可以听这些 元素,并用它做点什么。 Swing和AWT基于此 图案当用户移动 鼠标,点击或键入一些东西 在键盘上,这些动作是 转化为事件。用户界面 组件听这些
事件并对其作出反应。

此场景涉及两个参与者。首先,你可以观察到一些其他玩家感兴趣的事情。这些其他玩家被称为观察员。观察者可以是计时器,观察者可以是任务,对报警事件感兴趣

Gamma、Helm、Johnson和Vlissides的《设计模式、可重用面向对象软件的元素》一书中描述了这种模式

两个例子:

用于解析XML的SAX解析器 通过XML文件并引发事件 每次遇到元素时。 听众可以听这些 元素,并用它做点什么。 Swing和AWT基于此 图案当用户移动 鼠标,点击或键入一些东西 在键盘上,这些动作是 转化为事件。用户界面 组件听这些
轮询和回调/事件之间的区别很简单:

轮询:您连续或每隔固定时间询问是否满足某些条件,例如,是否按下了某个键盘键。 回调:你对某个驱动程序、其他代码或其他任何东西说:在我们的示例中,当发生某个事件时,按下键盘,调用这个函数,然后传递给它事件发生时希望调用的函数。这样,您就可以忘记该事件,知道它发生时将得到正确处理。
轮询和回调/事件之间的区别很简单:

轮询:您连续或每隔固定时间询问是否满足某些条件,例如,是否按下了某个键盘键。 回调:你对某个驱动程序、其他代码或其他任何东西说:在我们的示例中,当发生某个事件时,按下键盘,调用这个函数,然后传递给它事件发生时希望调用的函数。这样,您就可以忘记该事件,知道它发生时将得到正确处理。
通过事件得到通知几乎总是比轮询更好,特别是当涉及硬件并且该事件源于发出CPU中断的驱动程序时。在这种情况下,当您等待某个硬件完成任务时,您根本不使用任何cpu。

通过事件得到通知几乎总是比轮询更可取,尤其是当涉及硬件且该事件源于发出cpu中断的驱动程序时。在这种情况下,在等待某个硬件完成任务时,您根本不使用任何cpu。

维基百科回调的定义是:

在计算机编程中,回调是 作为文件传递的可执行代码 参数转换为其他代码。它允许 较低级别的软件层调用 函数中定义的子例程或函数 高级层

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

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这样的现代语言有一种标准化的方法,他们称之为事件。事件只是添加到包含委托/方法指针/回调列表的类中的一种特殊类型的属性。这三种属性都是相同的。当事件被触发时,它只是在回调列表中迭代并执行它们。这些也被称为侦听器

这里有一个例子

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的事件。我 t允许希望在单击时收到通知的任何人注册回调方法。在这种情况下,按钮单击的处理程序方法将由单击的事件执行

事件/回调体系结构非常方便,只要您需要通知程序中的其他地方发生了某些事情,而您不知道这是何时或如何发生的

这大大简化了通知。轮询使其变得更加困难,因为您需要经常检查操作是否已完成。简单的轮询机制如下所示:

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

    //Button has been clicked.
}

问题是,这种特殊情况会阻塞现有线程,并且必须继续检查,直到Button.IsClicked为true。事件体系结构的优点在于它是异步的,让我们在事件完成时使用“代理项”按钮通知侦听器,而不是侦听器必须不断检查,

维基百科回调的定义是:

在计算机编程中,回调是 作为文件传递的可执行代码 参数转换为其他代码。它允许 较低级别的软件层调用 函数中定义的子例程或函数 高级层

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

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这样的现代语言有一种标准化的方法,他们称之为事件。事件只是添加到包含委托/方法指针/回调列表的类中的一种特殊类型的属性。这三种属性都是相同的。当事件被触发时,它只是在回调列表中迭代并执行它们。这些也被称为侦听器

这里有一个例子

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的事件。它允许任何希望在单击时收到通知的人注册回调方法。在这种情况下,按钮单击的处理程序方法将由单击的事件执行

事件/回调体系结构非常方便,只要您需要通知程序中的其他地方发生了某些事情,而您不知道这是何时或如何发生的

这大大简化了通知。轮询使其变得更加困难,因为您需要经常检查操作是否已完成。简单的轮询机制如下所示:

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

    //Button has been clicked.
}
问题是,这种特殊情况会阻塞现有线程,并且必须继续检查,直到Button.IsClicked为true。事件体系结构的好处在于它是异步的,让我们在完成时使用Acting Item按钮通知侦听器,而不是侦听器必须不断检查