2011-01-21 36 views
8

我已经定义了一个事件委托如下:BeginInvoke的@object参数应该传递什么?

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,参数为null,但我无法找到说明该参数的用途的文档。

那么这个参数的目的是什么?我们可以用它来做什么?

回答

8

这样就可以将您的方法中的任何相关信息传递给回调函数。由于C#具有lambda表达式,并且由于委托可以有状态,所以有时这是无用的,并且您可以传递null。但它有点类似于Control.Tag,它可以让你提供它可能找到的方便的回调信息。


更新:

为什么它甚至存在的起源可追溯到语言,只有有函数指针,没有闭合。 (你可能想查找单词“closure”......我不能简单地解释它)。在C中,只有函数指针而不是代表;因此,函数指针不能保持状态。因此,无论何时提供回调,被调用者都会通过为您提供额外的指针来帮助您,因此您可以将数据传递给您可能需要的回调。在.NET中,这些不太必要(因为代表具有Target对象并且可以保持状态),但有时它们很方便,而且它们来自哪里。

+1

+1将它设置为Control.Tag是有帮助的。 – Tergiver 2011-01-21 20:26:16

8

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

相关问题