2009-07-19 4 views
8

우선 VS2005와 C# 2.0을 사용하고 있습니다.C# 2.0 generics : 매개 변수가 0 인 Action 객체를 만드는 방법

SelectedIndexChanged 이벤트 내에서 콤보 상자의 Text 속성을 설정하려고합니다. 우선이의 지금

BeginInvoke(new Action(() => someCombobox.Text = "x")); 

나를 위해 컴파일러 오류를 반환 여기에 StackOverflow의 다른 thread에서이 다음과 같은 방식으로 일을 제안되었다. Action 객체가 두 언어 사양에서 다르게 동작하기 때문입니다. C# 2.0에서 Action 객체는 모든 선언에서 <T> 구조를 필요로합니다. 어쩌면 내가 틀렸을 지 모르지만 나는 그것을 분명히하고 싶습니다. 그냥 내가하려는 게 아니에요 특히 때문에 형식 매개 변수 (함께 작업 객체를 정의 내가에있는 것을 나에게 매우 이상한 것 같다, 그러나

BeginInvoke(new Action<string>(delegate { someCombobox.Text = "x"; }), new object[] { "" }); 

: 작업을 수행 무엇

는 다음과 모든 매개 변수를 전달하십시오)! 어떻게 든이 매개 변수를 제거하면 빈 새 객체 []가 쓸모 없게됩니다. 이는 내가 원하는 것입니다.

위 전화를 단순화 할 수있는 사람이 있습니까?

마지막으로 BeginInvoke가 SelectedIndexChanged 다음에 끝나고 올바른 텍스트로 콤보 상자의 Text 속성을 업데이트한다는 보장이 있습니까?

정말 이러한 질문에 대한 답변을 얻으시면 감사하겠습니다.

+0

컴파일 오류는 람다 식 때문에 발생합니다. Lambda는 C# 3.0의 새로운 기능으로, 간단한 형식의 대리자 작성 구문입니다. –

답변

9

매개 변수가없는 작업은 .NET 2.0에서 사용할 수 있습니다. 걱정하지 마세요. 미리 정의 된 다른 대리자 형식을 사용하십시오. MethodInvoker가 작업을 수행해야합니다 (매개 변수없이 void 메소드).

또한 BeginInvoke에는 두 개의 오버로드가 있습니다. 하나는 대리자를 사용하고 다른 하나는 대리자와 개체 배열을 사용하는 오버로드입니다.

BeginInvoke(new MethodInvoker(delegate() 
{ 
    someCombobox.Text = "x"; 
})); 
+0

'System.Action'이 오기 전에'MethodInvoker'를 여러 번 사용했습니다. :) –

9

자신 만의 액션 대리자를 정의 할 수 있습니다.

delegate void Action()

난 당신이 BeginInvoke를 호출하고있는 객체를 볼 수 있지만,이 콤보 상자와 같은 스레드에서 생성 된 UI 컨트롤 인 경우, 당신은 통과 대리인 일부를 호출 할 보장 SelectedIndexChanged 이벤트 처리기가 완료된 후 시간