我有一个事件委托,定义如下:
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
,但我找不到解释该参数用途的文档。
那么该参数的目的是什么?我们可以用它做什么?
答案 0 :(得分:9)
这样您就可以将方法中的任何相关信息传递给回调。由于C#具有lambda表达式,并且由于委托可以具有状态,因此有时这是无用的,并且您可以只传递null。但它有点类似于Control.Tag
,它允许您向它可能找到的回调提供信息。
更新
它甚至存在的原因可以追溯到只有函数指针的语言,没有闭包。 (你可能想查找“闭包”这个词......我无法简洁地解释它。)在C中,只有函数指针而不是委托;因此,函数指针不能保持状态。因此,每当您提供回调时,被调用者通过为您传递一个额外的指针来帮助您,因此您可以将数据传递给它可能需要的回调。在.NET中,这些不太必要(因为委托有Target
个对象并且可以保持状态),但有时它们很方便,而且它们就是它们的来源。
答案 1 :(得分:9)
您可以在那里提供任何您想要的东西。在AsyncResult方法中,您可以使用IAsyncResult.AsyncState检索此值。它可供您使用。
答案 2 :(得分:5)
这只是一个以IAsyncResult.AsyncState结尾的状态对象,可以在AsyncCallback代码中检索到。有点像ThreadPool.QueueWorkItem(WaitCallback, Object)。