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