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,但我找不到解释该参数用途的文档。

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

4

3 回答 3

10

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

于 2011-01-21T20:24:22.003 回答
9

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


更新:

它存在的原因可以追溯到只有函数指针而没有闭包的语言。(你可能想查一下“闭包”这个词......我不能很简洁地解释它。)在 C 中,只有函数指针,没有委托;因此,函数指针不能保持状态。因此,每当您提供回调时,被调用者会通过为您传递一个额外的指针来帮助您,因此您可以将数据传递给它可能需要的回调。在 .NET 中,这些不是必需的(因为委托具有Target对象并且可以保持状态),但有时它们很方便,这就是它们的来源。

于 2011-01-21T20:18:44.967 回答
5

这只是一个以IAsyncResult.AsyncState结尾的状态对象,可以在您的 AsyncCallback 代码中检索。有点像ThreadPool.QueueWorkItem(WaitCallback, Object)

于 2011-01-21T20:18:40.460 回答