Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BeginInvoke的三参数版本做什么?_C#_Begininvoke - Fatal编程技术网

C# BeginInvoke的三参数版本做什么?

C# BeginInvoke的三参数版本做什么?,c#,begininvoke,C#,Begininvoke,我一直在阅读一些关于互联网上数据虚拟化的代码。我遇到了一个名为BeginInvoke的函数。基本上,我知道它的用途。但是这个函数有一个包含三个参数的版本,我没有在MSDN中查找这些参数 我在MSDN中找到了它,它最多有两个参数: 我也不认为这是我想要的: 因为三参数版本的第一个参数有一个DispatcherPriority类型,我读的代码没有传递该类型 我正在阅读的代码是: using System; using System.Threading; namespace WPF.DataVi

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

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

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

因为三参数版本的第一个参数有一个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));
Load.BeginInvoke(m_Id, AsyncLoadCallback, null);
这三个参数的作用是什么?(看起来m_Id用作int)它们代表什么?在哪里可以找到此版本BeginInvoke的文档。

请查看:

开始异步操作

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

由于Load是一个
Func
,因此它的
BeginInvoke
方法有三个参数,具有以下类型:

  • TId
    (传递给异步调用的方法/委托)
  • (异步操作完成时调用)
  • 对象
    (用于传递状态)

正如我所想(这只是一个建议),这个参数是一个参数,它将被传递到回调函数的ivocation“我确实在MSDN中找到了”——不,你没有;您发现了另外两个同名的不相关方法。仅仅因为它有相同的名字并不意味着它有相同的含义<例如,code>Delegate.BeginInvoke与Control.BeginInvoke非常不同。intellisense或文档对数据虚拟化的
BeginInvoke
有何评论?见鬼,这个参数叫什么?一个有点类似的问题:
TId
被传递到
AsyncCallback
?但是
AsyncCallback
只有一个参数,即
IAsyncResult
类型。当代码使用它时,将int传递给它。那么它怎么可能是传递给委托方法的参数呢?不,
TId
不会传递给异步回调。它被传递到
Load
Load
是一个
Func
,因此它需要一个
TId
作为第一个参数。同步调用
Load(somethingtatid)
,异步调用
Load.BeginInvoke(somethingtatid,somethingtatid,whenLoadFinished,somethingtatid)
。根据文档,第三个参数是对象,“此对象可用于将特定于应用程序的状态信息传递给异步操作完成时调用的方法。”我想知道,它是如何传递给委托方法的。通过传递参数还是什么?