내 C#
프로그램은 특정 단추를 클릭 할 때 인수를 전달하는 명령 프롬프트 응용 프로그램을 시작하는 프로세스를 실행합니다.프로세스가 종료 될 때 코드를 실행하려고합니다. C#
프로그램은 사용자 선택 항목에서 디렉토리 경로를 가져 와서 비어 있는지 확인합니다.
비어 있지 않으면 각 루프는 디렉토리의 각 파일에 대한 전체 경로 배열을 반복합니다. 그것은 프로세스
여기
를 사용하여 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 };
가 동시에 생성되는 각 프로세스로 매번 실행될 것이라고 생각하는 것이 잘못 되었습니까?
"프로그램이 충돌합니다."너무 광범위합니다. 무엇이 구체적으로 오류입니까? – mason
System.Windows.Forms.dll에서 'System.InvalidOperationException'유형의 첫 번째 예외가 발생했습니다. '[3308] IonicFolderProtector.vshost.exe : Managed (v4.0.30319)'코드가 0 (0x0)으로 종료되었습니다. – adbarads
예외에서 메시지를 가져와야합니다. 내부 예외가 있으면 메시지를 가져와야합니다. – mason