2012-07-31 3 views
1

많은 단일 파일에서 데이터를 가져와야하는 WPF 프로젝트에서 작업하고 있습니다. 이러한 파일과 데이터의 실제 가져 오기는 backgroundworker doWork 메소드에서 수행됩니다. 작업과 진행률 표시 줄 업데이트도 완벽하게 작동합니다.대화 상자를 호출하고 backgroundworker에서 값을 가져 오는 중입니까?

그러나 이러한 파일에서 내가 무엇을하는지에 따라 현재 파일 처리를 진행하기 전에 사용자로부터 결정을받는 경우가 있습니다.

윈도우/대화 상자를 열어 거기에 설정된 값을 backgroundworker.doWork 메서드로 가져 와서 처리를 계속하는 가장 좋은 방법은 무엇입니까?

backgroundworker로도 가능합니까? 또는 메인/UI 스레드에서 처리 논리를 유지하고 어떻게 든 진행률 표시 줄을 업데이트해야합니까?

내 특정 문제에 대한 많은 유용한 정보를 찾지 못해 일부 사용자에게 나에게 몇 가지 힌트를 주거나 다른 리소스를 알려주기를 바랍니다.

답변

0

배경 작업자가 다른 스레드에서 작동합니다. 백그라운드 스레드에서 UI를 직접 호출 할 수 없습니다. 당신이 뭘 하려는지 achiving하는 한 가지 방법은 실제로 좋은 생각이다 백그라운드 스레드에서 처리 로직을 유지하는 사용자 입력

bool WaitFor_Input = false; //flag to indicate user input status 

    private void ThreadRun() 
    { 
     //THIS IS IN Background worker thread 
     //do task 
     WaitFor_Input = true; 
     //ask for user input 
     Dispatcher.BeginInvoke(new Action(Show_Dialogue), null); 
     while (WaitFor_Input); //Background worker waits untill user input is complete 
     //continue further processing 
    } 

    private void Show_Dialogue() 
    { 
     //THIS IS IN UI THREAD 
     //show your dialogue box here, update data variables 
     //finally set 
     WaitFor_Input = false; 
    } 

에 대한 UI를 호출 할 플래그를 사용하고 디스패처입니다.

+0

감사합니다. 정확하게 필요한 것입니다. 다른 사람들에게 유용 할 수있는 한 가지는 Show() 또는 Show()뿐 아니라 ShowDialog()를 사용하거나 Window가 다시 닫힐 때까지 Show가 대기하지 않기 때문에 많은 열린 창으로 끝날 것입니다. 대기 플래그는 즉시 true로 설정됩니다. – aaron

0

당신은

(이 또한 새로운 스레드를 생성합니다) new Thread 또는 BackgroundWorker상의 OpenFileDailog classShowDialog를 호출 할 수 있지만, 당신은 메인 스레드 당신에서 실행되는 모든 속성이나 제어를 전달하거나 업데이트 할 때 이 같은 Disptacher을 사용해야합니다.

Dispatcher.BeginInvoke(new Action(() => { YourMethodThatUpdatesSomething(); })); 
관련 문제