2014-05-20 2 views
-3

C#의 winform 응용 프로그램에 문제가 있습니다.레이블을 변경하는 데 시간이 오래 걸림

private void btnProcess_Click(object sender, EventArgs e) 
{ 
    lblStatus.Text = "Please wait..."; 
    /* 
    Code here 
    */ 
} 

내 코드 프로세스는 몇 초를 복용하지만 코드를 처리 한 후, 라벨의 텍스트를 변경하고 나는 그 전에 발생합니다 : 프로그램에서는,이 같은 상태 표시 등의 라벨과 방법을 가지고있다.

참고 : 저는 프로그래밍에 아마추어이며 영어를 잘 이해하지 못합니다. 간단히 해결책을 설명하십시오. 고맙습니다.

+0

GUI 스레드에서 장기 실행 태스크를 실행하지 마십시오. –

+0

@SamLeach 그 제목에 질문에 대답 할 수는 있지만, 질문을 읽으면 그는 정말로'endl '에 대해 전혀 묻지 않습니다. –

+0

'Timer' 또는'Thread'를 사용하면 다른 것을 볼 수 없습니다 – Abdullah

답변

3

업데이트 또는 새로 고침을 호출하여 다시 칠하기 이벤트를 사용하여 해킹 할 수 있지만 실제 해결 방법은 더 긴 작업에 BackgroundWorker을 사용하는 것입니다.

이것은 쉬운 일이 아니며 완벽하게 이해하는 언어로 된 자습서를 찾아야합니다.

0

winform 응용 프로그램 (뿐만 아니라 모든 GUI 응용 프로그램)에서는 GUI 스레드에서 긴 작업을 실행하지 않는 것이 좋습니다. 문제를 해결하려면 스레드 (here)를 사용하여 전체 mdsn 참조를 찾을 수 있습니다.
다른 스레드의 레이블을 업데이트하려면 크로스 스레딩 작업을 수행하십시오. 자세한 내용은이 부분을 참조하십시오. question

0

UI를 변경하기 전에 모든 코드가 실행되고 완료됩니다. 이것은 WinForms와 WPF의 기본적인 로직 일뿐입니다.

"BackgroundWorker"을 사용할 수 있으므로 더 긴 코드가 다른 스레드에서 실행됩니다. 이렇게하면 더 긴 코드가 실행되는 동안 UI 요소를 자유롭게 편집 할 수 있습니다.

0

.Net 4.5를 사용하는 경우 BackgroundWorker 대신 awaitasync을 사용할 수 있습니다.

작업을 반환하는 async 메서드를 만들고이 메서드 내부에 Task.Run()을 사용하여 배경 작업을 시작할 수 있습니다.

다음은 예입니다. 당신은 내가 댓글을 달았습니다 Task.Run()에 전달 된 람다의 모든 느린 작업 "여기 모든 느린 작업을 수행"할 거라고 :

private async void btnProcess_Click(object sender, EventArgs e) 
{ 
    lblStatus.Text = "Please wait..."; 

    await doSomeWorkAsynchronously(); 

    lblStatus.Text = "Work completed"; 
} 

private async Task doSomeWorkAsynchronously() 
{ 
    await Task.Run(()=> 
    { 
     // Do all your slow work here. 
     Thread.Sleep(5000); // Simulate slow work. 
    }); 
} 

나는이 BackgroundWorker를 사용하는 것보다 좀 더 쉽게 생각합니다.

참고 모든 "느린"방법이 있다면 이미 async (예를 들어, 당신이 asynchronous file I/O를 사용하는 경우) 다음 방금 오히려 Task.Run()를 통해 자신의 작업을 생성하는 것보다 당신의 비동기 작업의 await 각각 할 수 있습니다.

백그라운드 작업에서 값을 반환 할 수도 있습니다. 백그라운드 작업이 완료되었을 때 레이블을 업데이트 할 문자열을 반환한다고 가정합니다. 다음과 같이 할 수 있습니다.

private async void btnProcess_Click(object sender, EventArgs e) 
{ 
    lblStatus.Text = "Please wait..."; 
    lblStatus.Text = await doSomeWorkAsynchronously(); 
} 

private async Task<string> doSomeWorkAsynchronously() 
{ 
    return await Task.Run(()=> 
    { 
     // Do all your slow work here. 
     Thread.Sleep(5000); // Simulate slow work. 
     return "The task completed."; 
    }); 
} 
관련 문제