![](/img/trans.png)
[英]During BeginInvoke calls, what does the @object parameter refer to?
[英]What should be passed for BeginInvoke's @object parameter?
我有一个定义如下的事件委托:
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)
在大多数示例中,我看到在@object
参数为null
情况下调用BeginInvoke
,但我找不到解释该参数用途的文档。
那么这个参数的目的是什么? 我们可以用它做什么?
这样您就可以将任何相关信息从您的方法传递到回调。 由于 C# 具有 lambda 表达式并且由于委托可以具有状态,因此有时这是无用的,您可以只传递 null。 但它有点类似于Control.Tag
,它允许您向回调提供它可能觉得方便的信息。
更新:
它之所以存在的起源可以追溯到只有函数指针而没有闭包的语言。 (你可能想查一下“闭包”这个词……我不能很简洁地解释它。)在 C 中,只有函数指针而不是委托; 因此,函数指针不能保持状态。 因此,每当您提供回调时,被调用者都会通过为您传递额外的指针来帮助您,因此您可以将数据传递给它可能需要的回调。 在 .NET 中,这些不是必需的(因为委托具有Target
对象并且可以保存状态),但有时它们很方便,这就是它们的来源。
你可以在那里提供你想要的任何东西。 在 AsyncResult 方法中,您可以使用 IAsyncResult.AsyncState 检索此值。 它可供您使用。
这只是一个最终在IAsyncResult.AsyncState中的状态对象,可以在您的 AsyncCallback 代码中检索。 有点像ThreadPool.QueueWorkItem(WaitCallback, Object) 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.