C# 事件处理程序或回调

C# 事件处理程序或回调,c#,.net,events,event-handling,C#,.net,Events,Event Handling,我是C#的新手。现在我已经学习了如何在应用程序中创建自定义事件 我想知道为什么我们应该使用回调?事件似乎比回调更简单,并且不需要在参数中传递委托 我已经提到了,也有人提到过 事件就像匿名广播,而回拨就像 握手 请给我举一些例子来说明这一点。我不知道在哪里使用回调和事件处理程序,因为我找不到它们之间的任何区别。两者之间的语义差异,让您感到困惑的是,回调和事件在语义上实际上是有区别的 从技术上讲,实现它们的方式基本相同,所以让我解释一下 回调是指您正在调用的代码的契约要求您提供某个地方,以便它回调、

我是C#的新手。现在我已经学习了如何在应用程序中创建自定义事件

我想知道为什么我们应该使用回调?事件似乎比回调更简单,并且不需要在参数中传递委托

我已经提到了,也有人提到过

事件就像匿名广播,而回拨就像 握手


请给我举一些例子来说明这一点。我不知道在哪里使用回调和事件处理程序,因为我找不到它们之间的任何区别。

两者之间的语义差异,让您感到困惑的是,回调和事件在语义上实际上是有区别的

从技术上讲,实现它们的方式基本相同,所以让我解释一下

回调是指您正在调用的代码的契约要求您提供某个地方,以便它回调、报告进度、说它完成了,或者它需要通知您的任何内容

就像你打电话给图书馆,让他们帮你找一本书,然后在他们找到后再打电话给你。你期待着电话的到来。此外,图书馆不会告诉人们他们找到的书,除非明确要求这样做。如果他们在书架上或书架后面发现了不同的书,不要指望他们会因此给你(或其他人)打电话

另一方面,一个事件是“匿名广播”,类似于在树林里叫喊。你基本上是说“如果有人在乎,X就发生了”。在此之前,你还没有被明确告知给任何人打电话,你也不知道谁会听

从技术上讲,在您的代码中,您将通过向方法传递委托或挂接事件(将委托存储到方法)来实现这两种方法,因此在这方面,它们是同一硬币的两面,但它们的含义不同


一般来说,事件感觉更像“C#ish”,并且通常更容易处理,但这两种情况在编程语言和工具箱中都有其位置。

两者之间的语义差异,让您感到困惑的是,回调和事件在语义上实际上是有区别的

从技术上讲,实现它们的方式基本相同,所以让我解释一下

回调是指您正在调用的代码的契约要求您提供某个地方,以便它回调、报告进度、说它完成了,或者它需要通知您的任何内容

就像你打电话给图书馆,让他们帮你找一本书,然后在他们找到后再打电话给你。你期待着电话的到来。此外,图书馆不会告诉人们他们找到的书,除非明确要求这样做。如果他们在书架上或书架后面发现了不同的书,不要指望他们会因此给你(或其他人)打电话

另一方面,一个事件是“匿名广播”,类似于在树林里叫喊。你基本上是说“如果有人在乎,X就发生了”。在此之前,你还没有被明确告知给任何人打电话,你也不知道谁会听

从技术上讲,在您的代码中,您将通过向方法传递委托或挂接事件(将委托存储到方法)来实现这两种方法,因此在这方面,它们是同一硬币的两面,但它们的含义不同


一般来说,事件感觉更像“C#ish”,通常更容易处理,但这两种情况在编程语言和工具箱中都有其位置。

可能重复您不应该使用回调。您应该使用事件、
Task
IObservable
(Rx),视情况而定。@SLaks您能给我提供一个简单的场景吗?请查看本文的第1部分,但您可以查看其他7部分,它以示例说明委托回调异步回调…..事件维护在引发事件时要调用的处理程序函数列表,外部订阅者可以自由订阅和取消订阅。回调通常与操作的单个调用相关联。回调被提供给每个调用,被调用方在适当的时候发出回调信号。在可能的情况下,应使用任务而不是回调,并且您可能希望使用反应式扩展而不是事件。可能重复您不应使用回调。您应该使用事件、
Task
IObservable
(Rx),视情况而定。@SLaks您能给我提供一个简单的场景吗?请查看本文的第1部分,但您可以查看其他7部分,它以示例说明委托回调异步回调…..事件维护在引发事件时要调用的处理程序函数列表,外部订阅者可以自由订阅和取消订阅。回调通常与操作的单个调用相关联。回调被提供给每个调用,被调用方在适当的时候发出回调信号。在可能的情况下,应该使用任务而不是回调,并且您可能希望使用反应式扩展而不是事件。谢谢@Lasse V.Karlsen,这个例子太棒了!!1感谢@Lasse V.Karlsen,这个例子太棒了!!1.