事件调用和回调之间的区别可以忽略不计。回调只是委托(或函数指针)的调用。你不能在没有某种回调的情况下进行异步操作,并期望得到任何类型的结果。
对于事件,它们可以被多播。这意味着多次回调调用——所以这会更昂贵,因为你调用了多个方法。但是,如果您正在这样做,您可能需要这样做——另一种方法是拥有多个代表并手动调用它们。所以,不会有真正的好处。事件通常可以包括 sender/eventargs;所以,你得到了那个额外的对象和 eventargs 实例的创建;但我从未见过影响性能的情况。
就个人而言,我不使用基于事件的异步模式——我发现(在 .NET 4.5 之前)异步编程模型更加普遍。在 .NET 4.5 中,我更喜欢任务异步模式(以 Async 结尾的单个方法,而不是两种方法,一种以 Begin 开头,一种以 End 开头),因为它们可以与 async/await 一起使用,而且不那么冗长。
现在,如果问题是例如之间的区别new AsyncCallback(Async_Send_Receive.Read_Callback)
:
s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0,
new AsyncCallback(Async_Send_Receive.Read_Callback), so);
只是Async_Send_Receive.Read_Callback
例如:
s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0,
Async_Send_Receive.Read_Callback, so);
第二个只是第一个的简写;AsyncCallback
委托仍然是在幕后创建的。
但是,与大多数事情一样;即使普遍认为在性能、测试和测量方面没有明显差异。如果一种方式比另一种方式有更多好处(包括性能),请使用该方式。