2013-03-18 1 views
0

내 wpf 응용 프로그램에서 별도의 스레드로 버튼 클릭 이벤트를 만들고 UI가 사용자에게 반응하도록 백그라운드 프로세스로 실행했습니다. 아래 코드, 내가 별도의 window.For 나는 아래 디스패처 방법을 사용하고이 작업 사용자에게 제공하고 파일 이름을 변경하는 옵션을 가지고있는 WorkerMethod에와Dispatcher.BeginInvoke C#

private void btn_convert_Click(object sender, RoutedEventArgs e) 
{ 
    //Makes the conversion process as background task which 
    //makes the UI responsive to the user. 
    Thread thread = new Thread(new ThreadStart(WorkerMethod)); 
    thread.SetApartmentState(ApartmentState.MTA); 
    thread.IsBackground = true; 
    thread.Start(); 
} 

,

if (MessageBox.Show("Do you want to set filename?", 
    "Information", MessageBoxButton.YesNo, MessageBoxImage.Asterisk) == 
    MessageBoxResult.Yes) 
{       
    Action showOutput =() => 
    { 
     BlueBeamConversion.SetOutput _setOutput = 
      new BlueBeamConversion.SetOutput(); 
     _setOutput.ShowDialog(); 
    }; 

    Dispatcher.BeginInvoke(showOutput); 

    if (String.IsNullOrEmpty(MainWindow.destinationFileName)) 
       return; 

여기서 destinationFileName은 SetOutput 창에서 설정됩니다. 이제 코드를 실행하면 SetOutput 창이 나타나고 파일 이름을 설정할 때까지 기다리지 않습니다. 내가 window.Any의 suggessions은 대부분 환영의 setOutput에서 확인 버튼을 클릭 때까지 아래의 코드로 제공되는 파일 이름,

if (String.IsNullOrEmpty(MainWindow.destinationFileName)) 
           return; 

을 설정하기 전에 내가 어떻게 보유 할 수 있습니다.

BeginInvoke 대신 dispatcher.Invoke를 사용했습니다. 이제 창을 쥐고 새 이름을 얻습니다. 특정 라인에 workmethod의 코드를 계속되면하지만, 제발 벌금 코드 bekow,

if (MessageBox.Show("Do you want to set filename?", "Information", MessageBoxButton.YesNo, MessageBoxImage.Asterisk) == MessageBoxResult.Yes) 
        { 

         Action showOutput =() => 
         { BlueBeamConversion.SetOutput _setOutput = new BlueBeamConversion.SetOutput(); _setOutput.ShowDialog(); }; 
         Dispatcher.Invoke(showOutput); 

        for (int i = 0; i < _listFiles.Items.Count; i++)--- here it exits 
       {--------- } 

감사 상 기사 응용 프로그램 자체 종료

+0

문제에 대한 (부분) 해결책을 편집하지 마십시오. 'ShowDialog()'가 아닌'Show()'라는 원래 코드 –

+0

그리고 _listFiles은 무엇입니까? 또한 : 가독성을 위해 포맷을 시도하십시오. –

+0

_listFiles는 이름 listview 컨트롤입니다. 찾아보기 및 파일을 listview에 추가. – Sangeetha

답변

1

대신 쇼 (사용이 ShowDialog())와 출력을 저장 DialogResult를에

var result = _setOutput.ShowDialog(); 
1

는 대신 BeginInvoke의 호출을 사용할 수 있습니다

//Dispatcher.BeginInvoke(showOutput); 
Dispatcher.Invoke(showOutput); 
+0

+1 내 대답보다 좋은 대답 – TalentTuner

+0

나는 OP가 답을 결합해야한다고 생각합니다. –

+0

Dispatcher.Invoke (showOutput); 창을 쥐고있어. 하지만 지금 나는 또 다른 문제에 직면하고있다.setoutput 윈도우에서 filename을주고 ok를 누르면 workmethod 코드가 계속된다. 그러나 (int i = 0; i <_listFiles.Items.Count; i ++) 행에 도달하면 응용 프로그램이 자체적으로 종료합니다! ... – Sangeetha

0

당신이 window.show() 메소드를 사용하는 동안 당신은 show 메소드에서 어떤 결과도 얻지 못할 것입니다. 당신은 윈도우의 show dialog 메소드를 호출해야합니다.이 윈도우는 대화창이 닫히고 닫히기 전 까진 그것은 당신이 대화 창에서 데이터를 recive 수있을 것입니다.

Action showOutput =() => 
          { BlueBeamConversion.SetOutput _setOutput = new BlueBeamConversion.SetOutput(); _setOutput.ShowDialog(); }; 
         Dispatcher.BeginInvoke(showOutput); 

다른 한편으로는 먼저 스레드가 완료 될 때까지 기다릴 수 있고 기다릴 수있을 때까지 기다릴 수 있습니다. 이 approch도 당신을 위해 작동합니다. Dispatcher.Invoke가 도움이 될 것입니다. 아니면 DispatcherOperation을 시도해보십시오.

아래 코드가 변경되었습니다.

DispatcherOperation op = Dispatcher.BeginInvoke(showOutput); 

       op.Wait(); 

       if (String.IsNullOrEmpty(output)) 
        return; 
0

당신이 ShowDialog를 사용하는 경우, 당신은 두 번째 윈도우의 공용 속성에 값을 저장할 수 있으며, 이런 방식으로 액세스 할 수 있습니다

Form2 form2 = new Form2(); 
if (form2.ShowDialog() == DialogResult.OK) 
{ 
if (form2.ReturnData == "myResult") 

... }

관련 문제