문제

좋아, 여기 거래가 ...

.NET 2.0 (c#)에는 Windows (XP) 프로그램이있어 사용자가 주어진 .pdf 파일의 이름을 바꿀 수 있습니다. (파일 이름은 파일 자체의 내용에 대한 간단한 정보를 설명하므로 "구조적으로 설명 적입니다"입니다.) 프로그램의 유일한 형태에는 사용자가 .pdf 자체를 열 수 있도록 링크 라벨 객체가 있습니다. 그들이 이름을 바꾸는 것.

속임수는 사용자가 적절한 변경을하고 "저장"버튼을 클릭하면 .pdf가 닫히고, 저장이 수행되고, "다음"파일을 검색하고, 새로운 창 즉시 다음 파일을 표시합니다.

관련 코드 스 니펫은 다음과 같습니다.

    private void OpenViewer()
    {
        // NOTE: pdfView is of type Process, in case you're not familiar with
        // Process.Start().
        pdfView = System.Diagnostics.Process.Start(lnkFile.Links[0].LinkData.ToString());
    }

    private bool KillViewer()
    {
        bool result = (pdfView != null);

        if (pdfView != null)
        {
            pdfView.CloseMainWindow();
            pdfView.Close();
            pdfView.Dispose();
            pdfView = null;
            GC.Collect();

            // Verify that the lock is available before you return, as returning basically says:
            // "Yup, the file's available."
            bool locked = false;
            StreamWriter sw = null;
            do
            {
                try
                {
                    sw = new StreamWriter(new FileStream(lnkFile.Links[0].LinkData.ToString(), FileMode.Open));
                    locked = false;
                }
                catch (Exception)
                {
                    locked = true;
                }
            } while (locked);

            sw.Dispose();
        }

        return result;
    }

    private void SomeButtonEvent
    {
        // Record whether a viewer was open in the first place.
        bool viewerActive = KillViewer(); 

        PerformFileLockingMethod();
        GetNextFile()

        if(viewerActive)
        {
            OpenViewer();
        }
    }

PDF 뷰어가 잠금 장치를 완전히 해제 한 후까지 프로그램이 작업 파일의 이름을 바꾸려고 시도하지 않도록 기본적으로 잠금 고무 루프가 있음을 KillViewer ()에 알려주십시오.

문제는 이것입니다. 때로는이 모든 것이 아름답게 작동하며 때로는 killviewer가 CloseMainWindow () 호출에서 분류됩니다. 두 가지가 아니라면 이것은 상당히 간단 할 것입니다 ...

1 : pdfview.hasexited = true

그리고

2: Darned PDF 뷰어는 여전히 열려 있습니다 !!!

세상에서 어떻게 가능합니까? 창을 닫기 위해 사용해야하는 프로세스 명령이 있습니까? FYI, 프로그램은 어느 시스템 외부에서도 언급하지 않습니다.* 네임 스페이스 또는 궁극적으로 시스템 만 참조하는 내부적으로 구축 된 클래스.*.

감사.

도움이 되었습니까?

해결책 2

추가 조사 후, 나는 무슨 일이 일어나고 있는지 결정했다고 생각합니다.

상황을 안정적으로 복제 할 수 없었기 때문에 워크 플로 세부 정보를 자세히 설명하지 않았습니다. 추가 시도 후, 나는 두 가지 신뢰할 수있는 상황을 발견했습니다 ...

  1. 링크를 여러 번 클릭 한 다음 저장을 클릭하십시오.
  2. 링크를 클릭하고 뷰어 창을 닫고 저장을 클릭하십시오.

이러한 각 경우에, 문제는 PDFViewer가 사용자가 수행 한 작업과 동기화되지 않도록 지적한 프로세스로 요약되었습니다.

  1. 링크가 여러 번 클릭되면 활성 뷰어는 PDFViewer의 프로세스와 연결되지 않은 프로세스에 있으므로 위에서 설명한 것처럼 보이는 상황이 나타납니다.

  2. 링크를 클릭하고 창이 닫히면 pdfviewer 변수가 남아있어 hasexited = true로 프로세스가 남습니다.

이 모든 것에 대한 집으로의 수업은 다음과 같습니다. 기본 사용자 인터페이스와 별도의 프로세스를 실행하는 경우 외부 프로세스에서 발생할 수있는 모든 상황을 충족 시키도록하십시오.

기록상 Nick Guerrera는 프로세스 ID로 나를 지시 할 자격이 있습니다. 그것은 궁극적으로 그것을 해결했습니다.

다른 팁

대신 시도해보세요 ..

pdfView.Kill();
pdfView.WaitForExit();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top