2009-05-25 6 views
6

Windows 용 응용 프로그램에서 스레딩에 대해 알아보기 위해 Testbox를 만들었습니다. 실버 라이트와 자바가 Dispatcher를 제공하고있어 GUI 요소를 업데이트 할 때 정말 도움이됩니다.C#에서 대리자 구문의 문제점

코드 샘플 : 선언 클래스 위임

public delegate void d_SingleString(string newText); 

만들기 스레드

 _thread_active = true; 
     Thread myThread = new Thread(delegate() { BackGroundThread(); }); 
     myThread.Start(); 

스레드 기능

private void BackGroundThread() 
    { 
     while (_thread_active) 
     { 
      MyCounter++; 
      UpdateTestBox(MyCounter.ToString()); 
      Thread.Sleep(1000); 
     } 
    } 

위임 텍스트 상자 업데이트

public void UpdateTestBox(string newText) 
    { 
     if (InvokeRequired) 
     { 
      BeginInvoke(new d_SingleString(UpdateTestBox), new object[] { newText }); 
      return; 
     } 
     tb_output.Text = newText; 
    } 

BeginInvoke 메서드에서 Delate Declaration을 선언 할 수있는 방법이 있습니까? 당신이 프레임 워크에서 Action<T> 대표 (link to msdn)를 사용하여 다음과 같이 간단한 명 규모의

BeginInvoke(*DELEGATE DECLARATION HERE*, new object[] { newText }); 

많은 감사와 같은

뭔가 rAyt

답변

9

이와 같은 경우 대부분의 경우 가장 간단한 방법은 "캡처 된 변수"를 사용하여 스레드간에 상태를 전달하는 것입니다. 이 중 하나에서 안전주의 - 우리가 (너무 작은 점 InvokeRequired 확인) 작업자 스레드에서 호출 할 수 기대 경우

public void UpdateTestBox(string newText) 
{ 
    BeginInvoke((MethodInvoker) delegate { 
     tb_output.Text = newText; 
    });   
} 

가 위가 특히 유용하다 : 이것은 당신이 지역화 된 논리를 유지할 수 있다는 것을 의미합니다 UI 또는 작업 스레드를 사용하여 스레드간에 많은 양의 상태를 전달할 수 있습니다.

+0

당신의 수호를 사랑하십시오 Marc. 10 분 동안 MSDN을 읽는 것보다 더 많은 것을 배웠습니다 :) –

+0

단일 실 아파트의 경이 ... – Spence

+0

매우 우아한 솔루션; 이 질문에 대한 답은 실제로 받아 들여야합니다. –

4

.

public void UpdateTestBox(string newText) 
{ 
    if (InvokeRequired) 
    { 
     BeginInvoke(new Action<string>(UpdateTestBox), new object[] { newText }); 
     return; 
    } 
    tb_output.Text = newText; 
} 

그런 식으로 자신의 대리인 선언을 유지할 필요가 없습니다.

+2

반환 값이 필요한 경우 Func ... – tanascius

+0

멋지다! 고마워요 프레드릭. –

+0

tanascius, 댓글을 지정할 수 있습니까? 감사! –