BeginInvoke的三参数版本有什么作用?

时间:2015-02-12 09:13:36

标签: c# begininvoke

我一直在网上阅读一些关于数据虚拟化的代码。我遇到了一个名为BeginInvoke的函数。基本上,我知道它的用途。但是这个函数有一个带有三个参数的版本,我在MSDN中没有查找。

我确实在MSDN中找到了它最多有两个参数:

Control.BeginInvoke

我也不认为这是我想要的那个:

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的文档。

1 个答案:

答案 0 :(得分:1)

查看Asynchronous Programming Model (APM)

  

开始异步操作

     

开始 OperationName 方法接受签名中声明的所有参数   通过值或引用传递的方法的同步版本。任何输出参数都不是开始 _OperationName_method签名的一部分。 开始 _OperationName_method签名还包含两个附加参数。第一个定义了AsyncCallback委托,该委托引用异步操作完成时调用的方法。如果调用者不希望在操作完成时调用方法,则可以指定null(在Visual Basic中为Nothing)。第二个附加参数是用户定义的对象。此对象可用于将特定于应用程序的状态信息传递给异步操作完成时调用的方法。

由于加载是Func<TId, T>,因此BeginInvoke方法有三个参数,其中包含以下类型:

  • TId(传递给异步调用的方法/委托)
  • AsyncCallback(在异步操作完成时调用)
  • object(用于绕过州)。