programing

프로세스인지 확인하는 방법.시작()이(가) 성공적입니까?

easyjava 2023. 5. 9. 23:11
반응형

프로세스인지 확인하는 방법.시작()이(가) 성공적입니까?

프로세스를 시작하기 위해 두 가지 다른 방법을 시도했습니다.

첫번째

정의는 Start 메서드에 대한 파라미터로 정의됩니다.

System.Diagnostics.Process.Start("excel", string.Format("\"{0}\"", ExcelFileBox.Text.ToString()));

내 생각:

이번 건은 시작은 괜찮지만, 어떻게 피드백을 받아야 할지 모르겠습니다.

두번째

조사를 시작했습니다.ProcessStartInfoExcel이 성공적으로 시작되었는지 여부를 알고 싶기 때문입니다. 예를 들어, Excel이 사용자의 컴퓨터에 존재할 가능성이 매우 높지만 보증은 없으며 성공적으로 시작되지 않았을 때 사용자에게 Excel이 성공적으로 시작되었다고 표시하는 것은 어리석은 일입니다.

System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo
{
    FileName = "excel",
    Arguments = string.Format("\"{0}\"", ExcelFileBox.Text.ToString()),
    ErrorDialog = true,
    UseShellExecute = false,
    WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
};

try
{
    System.Diagnostics.Process.Start(startinfo);
}
catch (Exception err)
{
    Console.WriteLine(err.Message);
}

내 생각:

"시스템이 지정된 파일을 찾을 수 없습니다."라는 오류가 표시되지만, 이 오류가 Excel 응용 프로그램을 의미하는지 내 파일을 의미하는지는 분명하지 않습니다.어쨌든, 오류 메시지 기능은 감사하지만, 지금은 수신되지 않아야 합니다.

이런 일이 성공적으로 일어났는지 아는 방법에 대한 생각, 제안, 아이디어?

해결된

저는 프로세스를 시작하는 첫 번째 방법을 트라이캐치에 넣었고 그것은 아름답게 작동합니다.

프로세스의 MSDN 페이지입니다.Start()는 이 메서드에 Boolean 유형의 오버로드가 있으며, 여기서 반환 값은 다음을 의미합니다.

프로세스 리소스가 시작되면 true이고, 새 프로세스 리소스가 시작되지 않으면 false입니다(예: 기존 프로세스가 재사용되는 경우).

또한 세 가지 예외를 발생시킬 수 있습니다.

  • 잘못된 작업예외.

프로세스 구성 요소의 시작 정보에 파일 이름이 지정되지 않았습니다.

-또는 -

프로세스 시작 정보.프로세스StartInfo가 true인 동안 StartInfo 속성의 UseShellExecute 멤버가 true입니다.표준 입력, 프로세스 시작 정보를 리디렉션합니다.StandardOutput 또는 ProcessStartInfo를 리디렉션합니다.RedirectStandardError는 true입니다.

  • Win32 예외

연결된 파일을 여는 동안 오류가 발생했습니다.

  • 객체 처리됨예외.

프로세스 개체가 이미 삭제되었습니다.


이 프로세스의 오버로드를 사용합니다.Start()(메소드의 유일한 정적 오버로드) ProcessStartInfo 개체를 사용하여 프로세스 클래스의 인스턴스를 생성해야 합니다.

이에 대한 예는 다음과 같습니다.

ProcessStartInfo processStartInfo = new ProcessStartInfo("EXCEL.EXE");

Process process = new Process();
process.StartInfo = processStartInfo;
if (!process.Start())
{
    // That didn't work
}

하지만, 이것이 여전히 던져질 수 있다는 것을 고려할 때, 당신은 아마도 정전기 중 하나에 캐치를 감는 것이 더 나을 것입니다.메서드 호출을 시작합니다.


그런 점을 감안할 때, 프로세스에 대한 요청은 분명해 보입니다.Start()는 작동하거나 작동하지 않으며 반환 값이 0(또는 예외가 느려짐)인 것으로 이 값을 확인할 수 있습니다.

프로세스가 시작되면 프로세스 클래스의 특성(예: HasExited)을 사용하여 프로세스가 어떤 상태인지 확인할 수 있는 등 많은 제어 권한을 갖게 됩니다.

간단히 말해서, 사용자가 자신의 기계에 엑셀이 없으면 프로세스를 수행합니다.시작()은 예외를 발생시킵니다.

속성을 확인할 수 있습니다.0(성공) 가치

과정.Start()는 또한 기존 프로세스를 획득했는지 또는 새 프로세스가 시작되었는지 여부를 알려주는 부울 값을 반환합니다.

또한 프로세스의 프로세스 ID를 확인하여 프로세스가 시작/계속 실행 중인지 확인할 수 있습니다.다음과 같은 것:

bool started = False;
Process p = new Process();
p.StartInfo = YourStartInfo;
started = p.Start();

try {
  int procId = p.Id;
}
catch(InvalidOperationException){
  started = False
}
catch(Exception ex) {
  started = False
}

프로세스가 실제로 시작되었는지 정확하게 확인하기 위해 프로세스 ID를 찾으려고 했습니다. 프로세스 ID를 찾으면 프로세스 ID를 찾지 못하면 계속 진행하여 캐치를 입력하고 디버그 문을 인쇄합니다.

try
{
     bool pathExists = File.Exists(module.ExecutionPath);
     if (pathExists)
     {
         ProcessStartInfo startArgs = new ProcessStartInfo();
         startArgs.FileName = "C:\Windows\System32\notepad.exe";
         startArgs.Arguments = null;
           
         Process process = new Process();
         process.StartInfo = startArgs;
         process.Start();
            
        Process startedProcess = CheckIfProcessStarted(process);
     }
}
catch (Exception ex)
{
    Debug.WriteLine(ex.Message + "  " + ex.InnerException);
    Debug.WriteLine("Couldnt find the process so it never ran");
}
        
private Process CheckIfProcessStarted(Process process)
{
    return Process.GetProcessById(process.Id);
}

언급URL : https://stackoverflow.com/questions/5750651/how-to-know-if-process-start-is-successful

반응형