C# BeginInvoke的三参数版本做什么?
我一直在阅读一些关于互联网上数据虚拟化的代码。我遇到了一个名为BeginInvoke的函数。基本上,我知道它的用途。但是这个函数有一个包含三个参数的版本,我没有在MSDN中查找这些参数 我在MSDN中找到了它,它最多有两个参数: 我也不认为这是我想要的: 因为三参数版本的第一个参数有一个DispatcherPriority类型,我读的代码没有传递该类型 我正在阅读的代码是:C# BeginInvoke的三参数版本做什么?,c#,begininvoke,C#,Begininvoke,我一直在阅读一些关于互联网上数据虚拟化的代码。我遇到了一个名为BeginInvoke的函数。基本上,我知道它的用途。但是这个函数有一个包含三个参数的版本,我没有在MSDN中查找这些参数 我在MSDN中找到了它,它最多有两个参数: 我也不认为这是我想要的: 因为三参数版本的第一个参数有一个DispatcherPriority类型,我读的代码没有传递该类型 我正在阅读的代码是: using System; using System.Threading; namespace WPF.DataVi
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
- (异步操作完成时调用)
(用于传递状态)对象
BeginInvoke
有何评论?见鬼,这个参数叫什么?一个有点类似的问题:TId
被传递到AsyncCallback
?但是AsyncCallback
只有一个参数,即IAsyncResult
类型。当代码使用它时,将int传递给它。那么它怎么可能是传递给委托方法的参数呢?不,TId
不会传递给异步回调。它被传递到Load
Load
是一个Func
,因此它需要一个TId
作为第一个参数。同步调用Load(somethingtatid)
,异步调用Load.BeginInvoke(somethingtatid,somethingtatid,whenLoadFinished,somethingtatid)
。根据文档,第三个参数是对象,“此对象可用于将特定于应用程序的状态信息传递给异步操作完成时调用的方法。”我想知道,它是如何传递给委托方法的。通过传递参数还是什么?