2013-01-07 11 views
2

내 C# winform 앱에서 나는 버튼을 클릭 할 때 약간의 시간이 걸리는 계산을 수행한다.# winforms events

또한 label.visible = false이 있습니다. 버튼을 클릭 한 직후에 label.visible = true이 표시되어 사용자가 멀리 떨어져있는 앱을 볼 수 있습니다. 연산이 수행 된 후 label.visible = truebutton1_Click(object sender, EventArgs e)이 방법에서 먼저 때에도 것 인

은, 단지, 맨 끝에 표시로 전환.

button_click 바로 뒤에 레이블을 표시하려면 어떻게해야합니까?

답변

1

여기에는 몇 가지 방법이 있습니다.

한 가지 방법은 (단순한) 당신이 볼에 라벨을 설정 한 후 바로

this.Refresh(); 

를 호출하는 것입니다.

다른 하나는 백그라운드 스레드에서 계산하는 것입니다. 가장 쉬운 방법은 BackgroundWorker을 사용하는 것입니다. 그런 다음 기본 스레드는 백그라운드 작업자 스레드가 계산을 수행하는 동안 UI를 계속 제공 할 수 있습니다 (양식 새로 고침, 버튼 응답 등).

배경 작업자 스레드에 대한 자세한 내용은 http://www.dotnetperls.com/backgroundworker을 참조하십시오.

+1

예 새로 고침은 정상적으로 작동하지만 코드를 깔끔하고 UI가 멈추지 않으므로 코드를 backgroundworker로 변경합니다. 고맙습니다. –

4

당신은 호출하여 당신은 & 과정을 어떤 배경 메시지를 업데이트하기 위해 양식을 강제 할 수 앱이 처리 인 반면, 반응 남아 Background Worker

살펴보고 응용 프로그램을해야하는 경우 :

Application.DoEvents(); 

그냥 라벨을 변경 한 후에 - 이것은 아마 약간의 해킹 해결책 일지 모르지만.

+0

실제로 'BackgroundWorker'를 맨 위에 놓아야하고 'DoEvents'도 금지해야합니다. http://stackoverflow.com/questions/5181777/use-of-application-doevents를보십시오 –

+0

예 - 사실 동의합니다. –

2

UI 스레드에서 계산이 수행되고 있습니다. 즉, 레이블의 가시성을 설정 한 후 UI가 다시 표시되지 않도록 차단합니다. 작업을 사용하여 다른 스레드에서 계산하는 것을 고려해야합니다. 이렇게하면 백그라운드에서 실행될 수있는 오랜 작업 인 것처럼 보이는 동안 UI가 응답 할 수 있습니다.

var taskCalc = Task.Factory.StartNew(() => //Do Calculation); 
1

다른 사람들의 말 : 당신은 UI 스레드에서 작업을 수행하고 있습니다. 나는 당신에게 필요한 것을 성취 할 수있는 또 다른 유효한 방법을 보여주고 있습니다. 익명의 대리인을 사용하여 작업을 별도의 스레드로 옮길 수 있습니다.

(new System.Threading.Thread(() => 
     { 
      dowork(); // What ever work you need put here. 
     })).Start(); 
+0

위의 코드는 어디에서 볼 수 있습니까? 또는 그것은 중요하지 않습니다. 다른 스레드가 실행하는 것처럼 button_click 메서드에서도 사용할 수 있습니까? –

+0

button_Click 메서드에서 실행할 수 있습니다. 또는 새 메서드를 만들고 button_Click 메서드에서 호출합니다. – Botonomous