2011-01-21 6 views
8

BeginInvoke의 @object 매개 변수에 전달해야 할 내용은 무엇입니까?

다음과 같이 정의 된 이벤트 대리자가 있습니다.

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) 

BeginInvokenull@object 매개 변수와 함께 BeginInvoke가 호출 된 것을 본 적이 있지만 그 매개 변수의 목적이 무엇인지 설명하는 설명서를 찾을 수 없습니다.

그래서 그 매개 변수의 목적은 무엇입니까? 우리는 그것을 무엇을 위해 사용할 수 있습니까?

답변

8

메소드의 관련 정보를 콜백에 전달할 수 있도록되어 있습니다. C#에는 람다식이 있고 대리자는 상태를 가질 수 있기 때문에 때때로이 함수는 쓸모가 없으며 null 만 전달할 수 있습니다. 그러나 Control.Tag과 약간 비슷하며 콜백에 정보를 제공하여 편리 할 수 ​​있습니다.


업데이트 :

조차 존재 이유의 기원은없는 폐쇄와 함께, 함수 포인터를 가지고 언어로 돌아갑니다. (당신은 "클로저"라는 단어를 찾아야 할 것입니다 ... 나는 그것을 간결하게 설명 할 수 없습니다.) C에서는 함수 포인터 만 있고 델리게이트는 아닙니다. 따라서 함수 포인터는 상태를 유지할 수 없습니다. 따라서 콜백을 제공 할 때마다 피 호출자가 추가 포인터를 전달하여 도움을 주었기 때문에 콜백에 필요한 데이터를 전달할 수있었습니다. .NET에서는 대리자가 Target 개의 개체가 있고 상태를 유지할 수 있기 때문에 이러한 작업이 덜 필요하지만 때로는 편리하고 때로는 출처가됩니다.

+1

+1 'Control.Tag'와 같이 사용하면 도움이됩니다. – Tergiver

8

원하는 것을 제공 할 수 있습니다. AsyncResult 메서드에서 IAsyncResult.AsyncState를 사용하여이 값을 검색 할 수 있습니다. 그것은 당신의 사용을위한 것입니다.

관련 문제