2012-09-12 3 views
0

일반적인 연습은 UI 스레드에 진행률 표시 줄과 함께 진행률 표시 줄을 표시하고 작업자 스레드의 진행률을 업데이트하는 것입니다.진행 표시 줄 표시 : 다른 방법으로 돌아 가기

저는 GUI 스레드 자체에서 시작되고 실행되는 많은 작업이 있습니다 (GUI 일시적 중단). 요구 사항은 기존의 모든 장기 작업에 대한 진행률 표시 줄을 표시하는 것입니다. 일반적인 해결책은 긴 작업을 스레드로 옮기고 거기에서 진행 상황을 업데이트하는 것입니다. 하지만 그 긴 작업의 스레드 안전에 대해 잘 모르겠습니다.

진행률 창을 다른 스레드에 표시하는 방법이 있습니까? (그래서 멈추지 않습니다) 주 GUI 스레드 자체에서 진행률을 업데이트 하시겠습니까?

+0

다른 스레드에서 실행할 수있는 별도의 클래스 그것은 당신에게 많은 슬픔을 덜어주고 나중에 더 나은 코드를 작성할 수 있도록 도와줍니다. – Enigmativity

+0

나는 그렇게하고 싶다. 그러나 이러한 작업은 과거에 파일, 데이터베이스, UI 컨트롤 및 모든 취약한 비 스레드 안전 항목과 관련된 다른 사람들이 작성했습니다. 시간과 노력은 상태를 방해하는 것을 좋아하지 않습니다. – Socrates

+0

나는 달라질 수 있지만, 나는 당신이 나보다 복잡성에 대해 더 잘 알고있을 것이라고 확신한다. 나쁜 생각으로 개발자의 시간을 낭비하고 상황을 악화시키는 것이라고 생각한다. 복잡한 시스템을 리팩토링하는 것을 배우는 것은 실습을 통해 더 잘 익힐 수있는 기술입니다. – Enigmativity

답변

1

ProgressBar를 다른 스레드에 표시하는 방법은 알지 못하지만 장기간 실행되는 작업에서 시스템이 해당 작업 (UI 업데이트)을 실행할 수 있도록 해킹 해 볼 수는 있습니다. 이 문제를 해결하는 좋은 방법이 아니다,

public static void DoEvents() { 
    DispatcherFrame frame = new DispatcherFrame(); 
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(delegate(object parameter) { 
    frame.Continue = false; 
    return null; 
}), null); 
    Dispatcher.PushFrame(frame); 
} 

그러나 조심이 들어, 장기 실행 작업 내에서 반복적으로 다음과 같은 함수를 호출 할 수 있습니다. 적절한 디자인을 선택하는 것이 좋습니다.

1

확인 당신이 사용한다고 생각이 thread

Application.DoEvents()

난 당신이 UI에서 벗어나으로 장기 실행 코드를 리팩토링하는 것이 장기적으로 더 나은 것이라고 좋을 것
+0

이것은 winforms입니다. OP는 WPF와 WPF에 Application.DoEvents가 없으므로 질문에 태그를 붙였습니다. 그것이 대체 기능을 게시 한 이유입니다. 그러나 언급했듯이 : 그것은 단지 일시적인 해결책 일뿐입니다. – HCL

+0

'Application.DoEvents()'의 사용은 매우 나쁜 관행이며 재입국과 같은 문제로 모든 종류의 문제를 일으킬 수 있습니다. – Enigmativity

+0

mmhmm 스레드로 UI의 진행률 표시 줄을 이동하려면 어떻게해야합니까? 그건 그렇고, 내 대답에 사과, 나는 이것이 winform 생각 :) – spajce