BeginInvoke的@object参数应该传递什么?

9

我有一个事件委托,定义如下:

public delegate void CallbackDelegate(Data data);
public event CallbackDelegate OnDataComplete;

我异步地触发了该事件:

// Raise the OnDataComplete event
OnDataComplete.BeginInvoke(new Data(), null, null);

随后,BeginInvoke方法的签名如下:
IAsyncResult CallbackDelegate.BeginInvoke(Data data, AsyncCallback callback, object @object)

在我看到的大多数示例中,BeginInvoke 被调用时 @object 参数都是 null,但我找不到解释这个参数目的的文档。
那么这个参数的目的是什么?我们可以用它来做什么?
3个回答

10

你可以在那里提供任何你想要的东西。在AsyncResult方法中,你可以使用IAsyncResult.AsyncState检索该值。它为你所用。


9
为了让你可以将任何相关信息从方法传递到回调函数。由于C#有Lambda表达式,并且委托可以具有状态,有时这是无用的,你可以只传递null。但这有点类似于Control.Tag,它允许您向回调提供信息,以便其可能会用到。
更新:
为什么它甚至存在的起源要追溯到只有函数指针而没有闭包的语言。(您可能想查一下“闭包”的定义……我不能简要地解释它。)在C中,只有函数指针而没有委托;因此,函数指针无法保存状态。因此,每当您提供回调函数时,被调用者通过为您传递额外的指针来帮助您,以便您可以向回调函数传递数据,这些数据可能是必要的。在.NET中,这些已经不是很必要了(因为委托具有Target对象并且可以保存状态),但有时它们是很方便的,这就是它们的来源。

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接