2011-03-27 4 views
1

실행중인 상태/상태 메시지를 게시하는 응용 프로그램이 있습니다 (데이터베이스 스키마 업데이터). UI를 사용하거나 사용하지 않고 실행할 수 있기 때문에 이러한 메시지는 콘솔이나 간단한 WPF 창으로 이동해야합니다. WPF 창이 모달로 열립니다. 메시지에 포함 된 것은 메시지가 게시 될 목록 상자입니다. 스레딩 문제 (콘솔이 아닌 상태에서 GUI는, 이동 단말기 스레드에 있어야한다) 나는 다음과 같은 논리를 사용에 대처하기 위해ShowDialog() 창 업데이트

는 :

if(args.NoUI) 
{ 
    // we're just doing plain old console-based logging 
    frame = new nHydrateInstallationFrame(installer) { ReportingThreshold = threshold }; 

    frame.Execute(); 
} 
else 
{ 
    // GUI has to be on an STA thread, so wrap ourselves and go! 
    frame = new nHydrateUIInstallationFrame(installer) { ReportingThreshold = threshold }; 
    // the Execute method on an nHydrateUIInstallationFrame object calls ShowDialog(). 
    // when the resulting window opens, the actual installation process begins to execute. 
    // this allows UI-based logging, and, more importantly, keeps the logging window open 
    // until the user explicitly closes it after the installation process completes. If 
    // we don't do this kind of indirect execution, the logging window will immediately close 
    // after the installation method ends, which will keep the user from reviewing the 
    // logging output 
    Thread staThread = new Thread(frame.Execute); 
    staThread.SetApartmentState(ApartmentState.STA); 
    staThread.Start(); 
    staThread.Join(); 
} 

이것은 단지 추출물이지만, 접근 방식을 보여줍니다. 즉, UI에 대한 별도의 스레드 생성, 아파트 상태 설정, 시작 및 가입)입니다. 이로 인해 프레임 (Output "sink"가 포함 된 개체)의 Execute 메서드가 실행됩니다. Execute 메서드는 실제 데이터베이스 스키마 수정 루틴을 호출하고 매개 변수로 자신을 전달합니다. 스키마 수정 루틴은 프레임에 메시지를 기록한 다음 콘솔 또는 UI로 메시지를 출력합니다.

이 모든 것이 정상적으로 작동합니다 ... UI에서 실행되는 프로세스가 완료 될 때까지는 UI 창에 게시 된 메시지가 표시되지 않습니다. 마우스를 사용하여 UI 메시지 창을 확장하는 경우를 제외하고 추가해야합니다. 이 경우 메시지는 게시 될 때 표시됩니다.

이것은 내가 주위에 놀지 않는 한 UI 창에 초점이없는 상태에서 포커스 문제가 있다고 생각합니다. 그러나 나는 확실하지 않다. UI 창에 포커스를 설정하자 마자 시도했지만 아무 것도하지 않았습니다.

실시간으로 표시 할 메시지를 UI 창에 게시하는 방법에 대한 의견을 보내 주시면 감사하겠습니다.

답변

1

내 생각에 당신은 UI 스레드에서 데이터베이스 업그레이드 프로그램을 실행하는 것이 좋습니다. 이 경우 백그라운드 스레드에서 업그레이드 루틴을 실행하고 거기에서 창에 메시지를 게시하십시오. 그 목적으로 BackgroundWorker 클래스를 살펴볼 수 있습니다.

+0

아! 그게 정확히 내가하고있는 일이며, 그것이 어떻게 문제를 일으킬 수 있는지 알 것 같습니다. 나는 백그라운드 스레드에 업 그레 이드 시도해 보겠습니다. –

+0

프로세스에 대한 배경 스레드와 약간 다른 접근법을 사용했지만 결국 UI 스레드에서 업데이트를 분리하는 것이 해결책이었습니다. 감사! –