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

时间:2011-01-21 20:14:32

标签: c# multithreading events delegates begininvoke

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

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 个答案:

答案 0 :(得分:9)

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


更新

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

答案 1 :(得分:9)

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

答案 2 :(得分:5)

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