c# 콜백함수 예제

Posted on

구현을 진행하기 전에 EnumWindows 함수의 서명을 살펴봅니다. EnumWindows에는 다음과 같은 서명이 있습니다: 위에 표시된 인쇄 대리자는 인쇄로 선언된 동일한 반환 유형 및 매개 변수가 있는 메서드를 가리키는 데 사용할 수 있습니다. 인쇄 대리자를 선언하고 사용하는 다음 예제를 고려합니다. 한 매개 변수를 사용하는 작업 대리자를 사용하도록 이전 예제를 수정합니다. 이벤트를 만들고 시작하는 간단한 예제가 있습니다. 난수가 생성됩니다. 숫자가 5와 같으면 FiveEvent 이벤트가 생성됩니다. 어쨌든 이 모든 이유는 DLL 함수가 문자열을 변경할 수 없기 때문에 해당 형식을 사용할 수 없기 때문입니다. 참조로 전달하려고 해도 호출 코드가 문자열을 올바른 크기로 초기화할 수 있는 방법은 없습니다.

StringBuilder 클래스가 들어오는 위치입니다. StringBuilder 개체는 텍스트 길이가 StringBuilder 생성자에게 전달된 최대 길이를 초과하지 않는 한 호출된 함수에 의해 역참조되고 수정될 수 있습니다. 대리자 개체는 일반적으로 대리자가 래핑할 메서드의 이름을 제공하거나 익명 함수를 사용하여 생성됩니다. 대리자가 인스턴스화되면 대리자호출이 해당 메서드에 대한 대리자에 의해 전달됩니다. 호출자가 대리자에게 전달한 매개 변수는 메서드에 전달되고 메서드의 반환 값(있는 경우)은 대리자가 호출자에게 반환됩니다. 이를 대리자 호출이라고 합니다. 인스턴스화 된 대리자는 래핑 된 메서드 자체인 것처럼 호출 할 수 있습니다. 예: 콜백 함수가 작업을 완료하기 전에 가비지 수집기에서 대리자를 회수하지 않도록 합니다. 대리자를 매개 변수로 전달하거나 구조의 필드로 포함된 대리자를 전달하면 호출 기간 동안 수집되지 않은 상태로 유지됩니다.

따라서 다음 열거 예제의 경우와 마찬가지로 콜백 함수는 호출이 반환되기 전에 작업을 완료하고 관리되는 호출자의 추가 작업이 필요하지 않습니다. 컴파일 타임에 할당된 두 가지 유형의 대리자를 비교하면 컴파일 오류가 발생합니다. 대리자 인스턴스가 System.Delegate 형식의 정적 인 경우 비교가 허용되지만 런타임에 false가 반환됩니다. 예를 들어 C# 응용 프로그램이 DLL 함수를 호출할 수 있을 뿐만 아니라 DLL 함수는 콜백 시나리오에서 응용 프로그램에서 지정된 C# 메서드를 호출할 수도 있습니다. 콜백 시나리오는 무언가를 열거하는 함수를 호출하는 Win32 EnumXXX 함수를 사용하여 발견된 각 항목과 함께 Windows에서 호출하는 함수 포인터를 전달합니다. 이 작업은 PInvoke-to DLL 함수 및 대리자를 호출하여 콜백을 정의합니다. 대리자에 대한 재교육이 필요한 경우 14장 “대리자 및 이벤트 처리기”를 살펴보십시오. 어떤 메서드에서든 대리자를 만들 수 있습니다. 그들은 더 유연합니다.

다음 예제에서는 대리자 유형 매개 변수를 포함하는 PrintHelper 메서드를 사용하는 방법을 보여 줍니다.