2016-06-02 3 views
1

C# 프로그램은 특정 단추를 클릭 할 때 인수를 전달하는 명령 프롬프트 응용 프로그램을 시작하는 프로세스를 실행합니다.프로세스가 종료 될 때 코드를 실행하려고합니다. C#

  1. 프로그램은 사용자 선택 항목에서 디렉토리 경로를 가져 와서 비어 있는지 확인합니다.

  2. 비어 있지 않으면 각 루프는 디렉토리의 각 파일에 대한 전체 경로 배열을 반복합니다. 그것은 프로세스

    여기

를 사용하여 cli-task을 실행을 통해 루프 문제이므로 또한 점진

  • 을 위해 그것을 0으로 진행률 표시 줄을 설정하고 준비합니다 을하는 작업이 완료되면 파일을 반복하면서 파일을 삭제하고 진행률 표시 줄을 증가 시키길 원합니다.

    은 이런 하나 하나를 통해 이동이있는 경우이 잘 작동 :

    process.WaitForExit(10000); 
    File.Delete(fileName); 
    progressBar1.Increment(1); 
    

    을하지만, 프로그램이 매우 느립니다. 다음 프로세스가 시작되기 전에 각 프로세스가 완료되기를 기다립니다. 나는 그것이 File.Delete(fileName) 부분에 도달 할 때 프로그램 충돌이 방법을 실행하지만, 원래 process.start 작업이 작동 할 때 불행하게도

    string[] files = Directory.GetFiles(label1.Text); 
    
    if (files.Length != 0) 
    { 
        progressBar1.Value = 0; 
        progressBar1.Minimum = 0; 
        progressBar1.Maximum = files.Length; 
    
        foreach (string fileName in files) 
        { 
         System.Diagnostics.Process process = new System.Diagnostics.Process(); 
         System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
         //startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
         startInfo.FileName = @"C:\Program Files\cli-tool\cli.exe"; 
         startInfo.Arguments = "-i " + "\"" + fileName + "\"" + " -o " + "\"" + label2.Text + "\\" + Path.GetFileName(fileName) + "\"" + " -s -t"; 
         process.StartInfo = startInfo; 
         process.EnableRaisingEvents = true; 
         process.Start(); 
         process.Exited += delegate 
         { 
          File.Delete(fileName); 
          progressBar1.Increment(1); 
         }; 
        } 
    

    하지만 할 수 있습니다 :

    그래서 나는 다음 아래 코드를 시도 그 프로세스를 종료 한 첫 번째 프로세스의 첫 번째 파일을 제거하십시오.

    다음 오류 비주얼 스튜디오의 디버그 콘솔에 나타내

    'System.InvalidOperationException'형식의 첫째 예외가 system.windows.forms.dll 가 프로그램 "[3308] 발생 IonicFolderProtector.vshost.exe : Managed (v4.0.30319) '가 코드 0 (0x0)으로 종료되었습니다.

    이 코드의 문제점을 확인할 수 없습니다. process.Exited += delegate { // some code };가 동시에 생성되는 각 프로세스로 매번 실행될 것이라고 생각하는 것이 잘못 되었습니까?

  • +0

    "프로그램이 충돌합니다."너무 광범위합니다. 무엇이 구체적으로 오류입니까? – mason

    +0

    System.Windows.Forms.dll에서 'System.InvalidOperationException'유형의 첫 번째 예외가 발생했습니다. '[3308] IonicFolderProtector.vshost.exe : Managed (v4.0.30319)'코드가 0 (0x0)으로 종료되었습니다. – adbarads

    +0

    예외에서 메시지를 가져와야합니다. 내부 예외가 있으면 메시지를 가져와야합니다. – mason

    답변

    3

    당신이 variable capture issue에에서 실행중인 예쁜 물론, foreach 내부 var temp = filename;을 넣어 그 대리인에 File.Delete(temp);을한다.

    foreach (string fileName in files) 
    { 
        var temp = fileName; 
        System.Diagnostics.Process process = new System.Diagnostics.Process(); 
        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
        //startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
        startInfo.FileName = @"C:\Program Files\cli-tool\cli.exe"; 
        startInfo.Arguments = "-i " + "\"" + fileName + "\"" + " -o " + "\"" + label2.Text + "\\" + Path.GetFileName(fileName) + "\"" + " -s -t"; 
        process.StartInfo = startInfo; 
        process.EnableRaisingEvents = true; 
        process.Start(); 
        process.Exited += delegate 
        { 
         File.Delete(temp); 
         progressBar1.Increment(1); 
        }; 
    } 
    

    올바른 파일이 실제로 삭제되고 있는지 확인합니다. 이벤트가 UI 스레드에서 실행될 것인지 잘 모르기 때문에 progressBar1.Increment()에 대한 호출을 수행해야 할 수도 있습니다.

    process.Exited += delegate 
        { 
         File.Delete(temp); 
         progressBar1.Invoke(new Action(() => progressBar1.Increment(1))); 
        }; 
    
    +0

    누락)'progressBar1.Invoke (새 Action (() => progressBar1.Increment (1)); '의 끝 ​​부분에서 시도했으나 모두 작동 중입니다. – adbarads

    관련 문제