2011-01-05 5 views
1

C#을 사용하여 개발 한 Windows 응용 프로그램이 있습니다. 이 응용 프로그램에서는 하나의 프로세스를 만들고 있습니다. Process_Exited() 이벤트가 발생하면 몇 개의 버튼을 활성화 및 비활성화하려고합니다. Process_Exited에서 () 메소드는, 내가 버튼을 활성화하는 코드를 작성했지만 런타임에 나뿐만프로세스가 종료 된 후 양식 버튼을 활성화하는 방법은 무엇입니까?

"크로스 스레드 작업 유효하지 오류받을 다음 아닌 다른 스레드에서 액세스 제어 'tabPage_buttonStartExtraction' 을 그 스레드가 생성 된 스레드입니다. "

내 코드는 다음과 같습니다

void rinxProcess_Exited(object sender, EventArgs e) 
{ 
    tabPage_buttonStartExtraction.Enabled = true; 
    tabPageExtraction_StopExtractionBtn.Enabled = false; 
} 

는 사람이이를 가능하게하는 방법을 제안 할 수 있습니다?

답변

2

:

는 여기에 귀하의 예에 적용되는 솔루션입니다. 다음과 같이 시도해보십시오.

다른 스레드의 UI에서 많은 작업을하지 않아야합니다. 호출이 상당히 비싸기 때문입니다.

출처 : http://msdn.microsoft.com/en-us/library/ms171728.aspx

3

활성화/비활성화 줄을 별도의 메서드로 이동하고 Control.Invoke 메서드를 사용하여 rinxProcess_Exited에서 해당 메서드를 호출합니다.

2

UI 스레드에서 UI를 변경해야합니다. 자세한 내용은 this question을 참조하십시오. 당신은 다른 스레드에서 UI 변경을 시도하고

void rinxProcess_Exited(object sender, EventArgs e) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke((Action)(() => ProcessExited())); 
     return; 
    } 

    ProcessExited(); 
} 

private void ProcessExited() 
{ 
    tabPage_buttonStartExtraction.Enabled = true; 
    tabPageExtraction_StopExtractionBtn.Enabled = false; 
} 
+0

.net 2.0 프레임 워크에서 작동합니까? 나는 => 연산자가 3.5 프레임 워크에 추가 된 것 같아. – Shekhar

+0

맞아. 2.0 프레임 워크를 사용하는 경우 익명 메서드 대신 대리자를 사용해야합니다. 방금 3.5 이상으로 가정했습니다. –

관련 문제