我在互联网上读到了一些关于数据虚拟化的代码。我遇到了一个名为BeginInvoke的函数。基本上,我知道它的用途。但是这个函数有一个包含三个参数的版本,我没有在MSDN中查找到这些参数。
我确实在MSDN中找到了它,它最多有两个参数:
Control.BeginVoke
我也不认为这是我想要的:
Dispatcher.BeginInvoke
因为三参数版本的第一个参数是DispatcherPriority类型,我读取的代码没有通过
我正在阅读的代码是:
using System;
using System.Threading;
namespace WPF.DataVirtualization
{
public class AsyncDataRef<TId, T> : DataRefBase<T> where T : class
{
private readonly TId m_Id;
private int m_Loading;
private readonly Func<TId, T> Load;
private volatile T m_Data;
public AsyncDataRef(TId id, Func<TId, T> load)
{
m_Id = id;
Load = load;
}
public override T Data
{
get
{
if (m_Data != null)
return m_Data;
if (Interlocked.Increment(ref m_Loading) == 1)
if (m_Data == null)
Load.BeginInvoke(m_Id, AsyncLoadCallback, null);
else
Interlocked.Decrement(ref m_Loading);
else
Interlocked.Decrement(ref m_Loading);
return m_Data;
}
}
private void AsyncLoadCallback(IAsyncResult ar)
{
m_Data = Load.EndInvoke(ar);
Interlocked.Decrement(ref m_Loading);
// when the object is loaded, signal that all the properties have changed
NotifyAllPropertiesChanged();
}
}
}
当调用此函数时,它是这样使用的:
var list = new List<DataRefBase<Person>>(itemCount);
...
list.Add(new AsyncDataRef<int, Person>(i, LoadPerson));
人是另一种阶级。LoadPerson是一个委托函数。DataRefBase是一种模板类。
我的问题是这一行:
Load.BeginInvoke(m_Id, AsyncLoadCallback, null);
这三个参数的作用是什么?(似乎m_Id被用作int)它们代表什么?在哪里可以找到此版本BeginInvoke的文档。
了解异步编程模型(APM):
开始异步操作
Begin OperationName方法接受在的签名中声明的任何参数通过值或引用传递的方法的同步版本。任何out参数都不是Begin_OperationName_method签名的一部分。Begin_OperationName_method签名还包括两个附加参数。其中第一个定义了AsyncCallback委托,该委托引用异步操作完成时调用的方法。如果调用方不希望在操作完成时调用方法,则可以指定null(在Visual Basic中为Nothing)。第二个附加参数是用户定义的对象。此对象可用于将特定于应用程序的状态信息传递给异步操作完成时调用的方法。
由于Load是一个Func<TId, T>
,它的BeginInvoke
方法有三个参数,类型如下:
TId
(传递给异步调用的方法/委托)AsyncCallback
(异步操作完成时调用)object
(用于传递状态)