Что следует передать для параметра @object в BeginInvoke? - PullRequest
9 голосов
/ 21 января 2011

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

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 вызывается с параметром @object, равным null, но я не могу найти документацию, которая объясняет, какова цель этого параметра.

Так, какова цель этого параметра? Для чего мы можем его использовать?

Ответы [ 3 ]

9 голосов
/ 21 января 2011

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


Обновление:

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

9 голосов
/ 21 января 2011

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

5 голосов
/ 21 января 2011

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

...