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

Kir*_*ril 9 c# events multithreading delegates begininvoke

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

public delegate void CallbackDelegate(Data data);
public event CallbackDelegate OnDataComplete;
Run Code Online (Sandbox Code Playgroud)

我以异步方式引发事件:

// Raise the OnDataComplete event
OnDataComplete.BeginInvoke(new Data(), null, null);
Run Code Online (Sandbox Code Playgroud)

随后,签名BeginInvoke看起来像:

IAsyncResult CallbackDelegate.BeginInvoke(Data data, AsyncCallback callback, object @object)
Run Code Online (Sandbox Code Playgroud)

在我看到的大多数示例中都BeginInvoke使用@object参数调用null,但是我找不到解释该参数用途的文档.

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

Meh*_*dad 9

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


更新:

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

  • +1将其翻译为"Control.Tag"很有帮助. (2认同)

Ter*_*ver 9

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


sis*_*sve 5

这只是一个状态对象,最终出现在IAsyncResult.AsyncState中,可以在AsyncCallback代码中检索.有点像ThreadPool.QueueWorkItem(WaitCallback,Object).