2013-10-29 3 views
6

인수를 사용하여 명령 줄에서 exe를 실행하는 프로세스를 실행하며 완료하는 데 시간이 걸립니다. 그 동안 진행률 표시 줄과 취소 버튼이있는 대화 상자로 양식을 표시합니다. 취소 버튼을 누르면 프로세스가 중단/중지되어야합니다.실행 중 프로세스 취소

A. 주요 형태 Process 클래스의 공용 정적 객체를 선언하고 버튼을 클릭 취소 할 때 진행 양식에서 중단 :

public partial class frmMain : Form 
{ 
    public static Process Process = new Process(); 

    public static bool ExecuteCommand(string sCommandLineFile, string sArguments) 
    { 
     Process.StartInfo.FileName = sCommandLineFile; 
     Process.StartInfo.Arguments = sArguments; 
     Process.StartInfo.CreateNoWindow = true; 
     Process.StartInfo.UseShellExecute = false; 
     Process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 

     Process.Start(); 
     Process.WaitForExit(); 
    } 
} 

그리고 가까운 /에서 프로세스를 중지 나는 그것을 두 가지 방법이 진행 창 형식 :

public partial class frmProgress : Form 
{ 
    private void btnCancel_Click(object sender, EventArgs e) 
    { 
     frmMain.Process.Close(); 
     frmMain.Process.Dispose(); 
    } 
} 

B. 또는 Process.WaitForExit();을 호출하지 마십시오.

public static bool IsCancelled = false; 

Process.StartInfo.FileName = sCommandLineFile; 
Process.StartInfo.Arguments = sArguments; 
Process.StartInfo.CreateNoWindow = true; 
Process.StartInfo.UseShellExecute = false; 
Process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 

while (!Process.HasExited) 
{ 
    Thread.Sleep(100); 
    Application.DoEvents(); 

    if (IsCancelled) 
    { 
     Process.Close(); 
     Process.Dispose(); 
    } 
} 

public partial class frmProgress : Form 
{ 
    private void btnCancel_Click(object sender, EventArgs e) 
    { 
     frmMain.IsCancelled = true; 
    } 
} 

을 할 수있는 올바른 방법은 무엇입니까 : 버튼을 클릭 취소하면 대신하여 프로세스가 실행 중인지 확인 및 취소 Process.HasExited를 사용할 수 있습니까?

답변

6

두 가지가 혼합되어 있습니다.

public partial class frmMain : Form 
{ 
    public static Process Process = new Process(); 

    public static bool ExecuteCommand(string sCommandLineFile, string sArguments) 
    { 
     Process.StartInfo.FileName = sCommandLineFile; 
     Process.StartInfo.Arguments = sArguments; 
     Process.StartInfo.CreateNoWindow = true; 
     Process.StartInfo.UseShellExecute = false; 
     Process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 

     Process.Start(); 
     // Process.WaitForExit(); // Don't wait here, you want the application to be responsive 
    } 
} 

그리고 취소 핸들러 물론

private void btnCancel_Click(object sender, EventArgs e) 
{ 
    frmMain.Process.Close(); // or .Kill() 
    frmMain.Process.Dispose(); 
} 

에서

이제 프로세스가 정상적인 방법으로 종료 여부를 찾는 방법이 필요합니다. Process.HasExited를 정기적으로 사용하여 해지를 폴링합니다. 타이머를 사용하는 것이 가장 좋습니다. 나는 현재 확신 할 수 없지만 이것에 대한 사건이있을 수도 있습니다.

두 번째 솔루션은 여전히 ​​사용자 인터페이스를 차단하면서 프로세스가 완료 될 때까지 기다리는 것이 문제입니다. 그리고 모든 종류의 불쾌한 부작용을 만들어 내기 때문에 반드시 피해야하는 Application.DoEvents()을 사용하고 있습니다 (예 : 재귀에서 동일한 코드를 여러 번 실행할 수 있음).

+0

'Process.HasExited'를 폴링 할 필요없이'frmMain.Process.CanRaiseEvents = true'를 실행 한 다음 [Exited] (https://msdn.microsoft.com/en-us/library/system.diagnostics)에 가입 할 필요가 없습니다. .process.exited (v = vs.110) .aspx) 이벤트. –

관련 문제