// delegate 를 수행하는 Task 를 새로 만들어서 시작합니다.
mTask = Taks.Factory.StartNew(delegate
{
// …
});
// Task 의 기존 작업인 `delegate`가 완료되면 `_form.BeginInvoke` 을 수행합니다.
mTask.ContinueWith((t => _form.BeginInvoke((Action)(() =>
{
// …
})));
// Task 가 완료되길 기다립니다.
mTask.Wait();
delegate는 "대리자"라고 이야기하는 컨셉입니다. 메서드 (함수)를 가리키는 참조를 담는 데이터 형식이라고 일단 이해하시면 쉽습니다. 다른 프로그래밍 언어에 비유하면 C, C++의 함수 포인터와 비슷합니다. 그러나 함수 포인터와 달리, 닷넷의 delegate는 하나의 메서드만을 가리키지 않고, 여러 개의 메서드를 가리키도록 연결할 수 있습니다. (다시 말해, 엄밀하게는 함수 포인터 != 대리자 입니다.)
delegate 타입의 변수를 만드는 방법은, (1) 먼저 선언되어있는 기존의 멤버 메서드를 가리키는 경우, (2) 익명 대리자 혹은 람다 식을 이용하여 짧은 본문을 가진 함수를 코드 본문 안에서 추가로 선언하는 방법, (3) 리플렉션 등을 이용해서 런타임 상에서 메타데이터를 읽는 방법 등이 있습니다.
아울러 delegate 타입은 하나의 타입이 아니라, 함수의 시그니처 (반환 형식, 제네릭 인자, 매개 변수 목록, 그리고 각 매개 변수의 입출력 방향이나 메서드 자체의 unsafe 코딩 필요 여부, 포인터 사용 여부 등)에 따라 제각기 달라지며, 람다 식이 도입된 이후부터는 이런 상황을 일반화할 목적으로 System.Action<…> 타입과 System.Func<…> 타입을 소개했고, 닷넷 기술 전반에 걸쳐 널리 활용합니다. 그 이전에는 직접 delegate 키워드로 타입 선언을 해서 써왔고, 이벤트 핸들러 한정으로는 System.EventHandler, System.EventHandler<…> 타입으로 일반화를 해왔습니다.
용어도 생소하고 제가 아직 부족하여 작성해 주신 내용을 전부 이해하지 못하였습니다.
(일단 rkttu 님께서 추천해 주신 C# 교과서 도서를 구매 하려고 합니다. 도서를 보면 용어에 대한 문제는 해결되지 않을까 생각됩니다.)
작성해 주신 내용처럼 저는 delegate가 함수 포인터 형태로 사용되는 것으로만 이해 하고 있어서 해당 구문을 이해하지 못하고 있는 것 같습니다. “mTask = Taks.Factory.StartNew(delegate”
소스 코드 내에 delegate로 선언된 함수가 없다 보니 상기 구문이 이해되지 않았던 것 같습니다.
작성해 주신 내용 중 3가지 케이스 중 어느 것에 해당하는 것인가요?
(1) 먼저 선언되어 있는 기존의 멤버 메시더를 가르키는 경우
(2) 익명 대리자 혹은 람다 식을 이용하여 짧은 본문을 가진 함수를 코드 본문 안에서 추가로 선언하는 방법
(3) 리플렉션 등을 이용해서 런타임 상에서 메타데이터를 읽는 방법