2015-02-12 2 views
1

Я читал некоторый код о виртуализации данных в Интернете. Я встретился с функцией BeginInvoke. В принципе, я знаю, для чего он используется. Но эта функция имеет версию с тремя параметрами, которые я не искал в MSDN.Что делает версия с тремя параметрами BeginInvoke?

я нашел его в 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.

+0

Как я думаю (это просто предложение), этот параметр является параметром, который будет передан для обратного вызова на его ivocation –

+1

«Я нашел его в MSDN» - нет, вы этого не сделали; вы обнаружили два других несвязанных метода с тем же именем. Просто потому, что он имеет одно и то же имя, это не значит, что он имеет то же значение; Например, 'Delegate.BeginInvoke' сильно отличается от' Control.BeginInvoke'. Что говорит intellisense или документация о «BeginInvoke» DataVirtualization? Heck, * какой параметр называется *? –

+1

Несколько аналогичный вопрос: http://stackoverflow.com/questions/14961450/where-are-clr-defined-methods-like-delegate-begininvoke-documented – BCdotWEB

ответ

1

Посмотрите Asynchronous Programming Model (APM):

Входит асинхронной операции

BeginOperationName метод принимает любые параметры, объявленные в подписи синхронной версии метода, передаются по значению или по ссылке. Любые параметры не являются частью . Начать _OperationName_method подпись. Начать _OperationName_method подпись также включает в себя два дополнительных параметра. Первый из них определяет делегат AsyncCallback, который ссылается на метод, который вызывается при завершении асинхронной операции. Вызывающий может указать null (Nothing в Visual Basic), если он не хочет, чтобы метод вызывался при завершении операции. Второй дополнительный параметр - пользовательский объект. Этот объект может использоваться для передачи информации о состоянии конкретного приложения в метод, вызываемый при завершении асинхронной операции.

Поскольку нагрузка является Func<TId, T>, это BeginInvoke метод имеет три параметра со следующими типами:

  • TId (передается в метод/делегат, который называется асинхронно)
  • AsyncCallback (вызывается, когда асинхронная операция)
  • object (используется для передачи состояния).
+0

'TId' передается' AsyncCallback'? Но 'AsyncCallback' имеет только один параметр, который является' IAsyncResult'. И когда код использует его, передайте ему int. Итак, как это может быть параметр, переданный методу делегата? – snowell

+0

Нет, 'TId' не передается ему AsyncCallback. Он передан 'Load'. 'Load' является' Func ', поэтому он ожидает, что' TId' станет первым параметром. Вы вызываете 'Load (somethingThatIsTid)' синхронно и 'Load.BeginInvoke (somethingThatIsTid, somethingThatIsCalledWhenLoadFinished, что-то)' асинхронно. – sloth

+0

Третий параметр, объект, в соответствии с документом: «Этот объект может использоваться для передачи информации о состоянии приложения для метода, вызванного при завершении асинхронной операции». Интересно, как он переходит к методу делегата. Передавая параметры или что? – snowell