2009-04-06 5 views
3

우리는 정기적으로 작업을 시작해야하는 Windows 응용 프로그램에서 작업하고 있습니다. 우리는 이러한 작업을 BackgroundWorker에서 실행하는 패턴을 얻었으며 각 작업에 필요한 빠른 WinForm을 작성했습니다. 여기서 필요한 매개 변수를 양식에 전달하고 양식이 BackgroundWorker를 연결하고 함수 호출을 작성합니다. 양식에 출력이 표시됩니다 (진행 막대 이동, 텍스트가 업데이트로 채워짐 등)..NET 배경 작업자 생성

이제이 양식은 매우 쿠키 커터입니다. 양식 사본간에 실제로 다른 유일한 부분은 어느 메소드가 어떤 객체에서 호출되는지입니다. 그래서 우리가하고 싶은 것은 그것을 일반화하여 폼을 취하고 객체 (정적 호출의 경우 null), 함수 이름 및 매개 변수 배열을 전달하고이를 "이동"하도록 할 수 있습니다. 거기에서. 우리는 Reflection을 통해이를 수행 할 수있었습니다. 이 경우 우리가 반성하는 것에 대해 싫어하는 것은 강력한 타이핑이 없다는 것입니다. 메소드 호출의 철자 오류와 같은 것들은 런타임에 잡히고 시간을 컴파일하지 않습니다. 더 우아하고 견고한 제품을 만들 수있는 제품이 있습니까? 저는 사람들이 대표자들과 표정 나무들에 관해 이야기하는 것을 들었습니다. 그러나 나는 전자가 후자에 관해 어둠 속에서 조금이라도 적용된다고 확신하지 못한다.

답변

6

일반 서식을 만들어 BackgroundWorker에서 실행해야하는 메서드를 가리키는 대리자를 전달하는 것이 현명한 해결 방법입니다.

Form 생성자를 일반 위임 (액션이 좋은 생각 일 수 있음)을 인수로 사용하고 생성자에서 Action의 서명과 일치하는 람다 식을 전달할 수 있습니다. 그런 다음 foreach 액션을 수행하면 알맞은 람다 식만 지정하면됩니다.

람다 식은 지역 변수를 포착 할 수 있으므로 이전에했던 모든 논리를 호출하고 동일한 매개 변수를 전달할 수 있습니다.

+0

내가 이해하는 것처럼, 나는 결국이 방법으로 호출되는 바람을 피울 수있는 각 메서드에 대한 새 대리자를 만들어야 할 것인가? – GWLlosa

+0

@GWLIosa -이를 명확히하기 위해 대답을 약간 확장하려고했습니다. 각 메서드에 대해 명시적인 대리자 형식을 지정할 필요가 없습니다. – driis

3

람다 기능도 확인하고 싶을 것입니다. 제네릭을 사용할 때 특별히 사용합니다. 그렇지 않으면 대리인이 잘 작동합니다.

다음
public static void DisplayForm(Action action) { 
    DisplayFormUsingInvoke(action); 
} 

public static void DisplayForm<T>(Action<T> action, T param) { 
    DisplayFormUsingInvoke(action, param); 
} 

public static void DisplayForm<T,U>(Action<T,U> action, T param1, U param2) { 
    DisplayFormUsingInvoke(action, param1, param2); 
} 

... 

, 당신은 private 메소드를 가질 수 있습니다 : 당신이 할 수

2

것은이 같은 (인수, 하나 개의 인수 등과 방법에 대한 하나의 방법에 대한 하나) 여러 가지 방법을 만드는 것입니다 이는 실제로 현재의 방법과 유사하게, 작업을 수행하지만, 클라이언트 코드에 노출되지 :

private static void DisplayFormUsingInvoke(Delegate d, params object[] parms) { 
    // Edit this code to run it on the background thread, report progress, etc. 
    d.DynamicInvoke(parms); 
} 

그런 다음 클라이언트 코드가 올바른 번호와 인수의 유형은 요구 사항을 적용 할 공공 방법 중 하나를 호출합니다 제공됩니다.

관련 문제