Что следует передать для параметра @object BeginInvoke?

у меня есть делегат события, который определяется следующим образом:

public delegate void CallbackDelegate(Data data);
public event CallbackDelegate OnDataComplete;

Я поднимаю событие асинхронно:

// Raise the OnDataComplete event
OnDataComplete.BeginInvoke(new Data(), null, null);

впоследствии, подпись BeginInvoke выглядит так:

IAsyncResult CallbackDelegate.BeginInvoke(Data data, AsyncCallback callback, object @object)

в большинстве примеров я видел BeginInvoke С

3 ответов


это так, что вы можете передать любую соответствующую информацию из своего метода в обратный вызов. Поскольку в C# лямбда-выражения и поскольку делегаты могут иметь государства, иногда это бесполезно, и вы можете просто передать null. Но это немного похоже на Control.Tag, и это позволяет вам дать информацию обратному вызову, который он может найти удобным.


обновление:

происхождение того, почему он даже существует, восходит к языкам, которые имели только указатели функций, без закрытия. (Вы могли бы хотите посмотреть слово "закрытие"... Я не могу объяснить это очень кратко.) В C есть только указатели функций, а не делегаты; следовательно, указатели функций не могут удерживать состояние. Поэтому всякий раз, когда вы предоставляли обратный вызов, вызываемый помог вам, передав дополнительный указатель для вас, чтобы вы могли передать данные вашему обратному вызову, которые могут понадобиться. В .NET они менее необходимы (потому что делегаты имеют Target объекты и могут удерживать состояние), но иногда они удобны, и именно там они приходят от.


вы можете предоставить все, что вы хотите там. В методе AsyncResult это значение можно получить с помощью IAsyncResult.Параметр asyncstate. Он там для вашего пользования.


Это просто объект состояния, который заканчивается в объекта iasyncresult.Параметр asyncstate Это можно получить в вашем коде AsyncCallback. Вроде как ThreadPool.QueueWorkItem (WaitCallback, Object).