繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM