2009-06-17 3 views
1

Microsoft.SqlServer.Management.Smo.Restore 개체를 사용하여 SQL Server 2000 데이터베이스를 복원하려고합니다. 복원 작업을 시작하기 직전에 사용자가 진행중인 작업을 알 수 있도록 레이블의 텍스트를 변경합니다. 그러나 변경된 텍스트는 fullRestore.Wait() 행 이후까지 GUI에 표시되지 않습니다 (즉, 텍스트는 그대로 유지됩니다).Label.Text 변경이 차단되고 있습니까?

lblStatus.Text = "Restoring Database"; 
Restore fullRestore = new Restore(); 

// Configure fullRestore 

fullRestore.SqlRestore(_server); 
fullRestore.Wait(); 

이상한 것은 lblStatus 결국 복원 있지만까지 후 디스플레이 "데이터베이스 복원이"완료 않습니다이다. 어떤 아이디어?

답변

2

업데이트를 방해하는 GUI 스레드를 차단하고 있습니다. lblStatus.Refresh()를 호출하거나 Wait to background thread (궁극적으로 옳은 일)를 옮길 수 있습니다.

+0

어떤 차이를하지 않습니다 lblStatus.Refresh()를 호출하면 사용이 있도록 컨트롤을 무효화 할 수 있습니다 GUI 스레드가 사용 가능할 때까지 실제 다시 그리기가 계속 수행 될 수 없습니다. –

+0

@Simon - GUI 스레드를 잠그고있는 호출 전에 다시 그립니다. –

+0

흥미 롭다. lblStatus.Refresh()를 시도해 보았고 정확하게 필요한 부분을 수행했다. 나는 Wait()에 대한 배경 스레드가 더 나은 해결책이 될 것이라는 것을 알고있다. 그러나 이것은 충분히 간단하며 지금 당장은 효과가있다. – Donut

0

스레딩 문제입니다. 별도의 스레드 또는 백그라운드 스레드에서이 작업을 수행 할 수 있습니다. 사람들이 사용하는 한 가지 접근 방법은 Application.DoEvents()를 사용하는 것입니다.

0

포 그라운드 스레드에서 처리를 완료하고 릴리스 할 때까지 GUI 업데이트를 수행 할 수 없습니다. 포 그라운드 스레드가 GUI를 계속 갱신 할 수있게하려면 백그라운드 스레드에서 복원해야합니다. 별도의 메소드에 복원 코드를 넣고 ThreadPool.QueueUserWorkItem()을 사용하고 restore 메소드를 전달하는 것을 고려하십시오. 이렇게하면 스레드 풀 스레드에서 복원 방법이 트리거됩니다.

가 완료 할 때 스레드 및 알림을 더 세밀하게 제어해야 할 경우, 당신은 않는 모든이하는 BackgroundWorker