質問

さて、これが取引です...

.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();
        }
    }

KillViewer()に、PDFビューアがロックを完全にリリースするまで、プログラムが作業ファイルの名前を変更しようとしないことを確認するために、基本的にロックグラビングループがあることに注意してください。

問題は次のとおりです。これはすべて、すべてが美しく機能することがあり、時にはkillViewerがCloseMainWindow()コールで壊れます。InvalidoperationExceptionを使用して、詳細=「プロセスが終了したため、要求された情報は利用できません。」 2つのことがなければ、これはかなり簡単です...

1:pdfview.hasexited = true

2: Darned PDF Viewerはまだ開いています!!!

これはどのように可能ですか?ウィンドウが閉じるために使用する必要があるプロセスコマンドはありますか?参考までに、プログラムはどちらのシステム以外でも何も参照していません。*名前空間、または最終的にシステムのみを参照する内部に構築されたクラス。*。

ありがとう。

役に立ちましたか?

解決 2

さらなる調査の後、私は何が起こっているのかを決めたと思います。

状況を確実に複製できなかったため、ワークフローの詳細については詳しく説明しませんでした。さらなる試みの後、私は2つの信頼できる状況を見つけました...

  1. リンクを複数回クリックして、[保存]をクリックします。
  2. リンクをクリックし、視聴者ウィンドウを閉じて、[保存]をクリックします。

これらの各ケースでは、PDFViewerがユーザーが行っていることと同期しなくなることを指摘したプロセスに極限になりました。

  1. リンクが複数回クリックされた場合、アクティブビューアはPDFViewerのプロセスに関連しないプロセスを使用していたため、上記で詳述されているように見えます。

  2. リンクがクリックされてウィンドウが閉じた場合、PDFViewer変数は残り、hasexited = trueでプロセスを残します。

これらすべてのテイクホームレッスンは次のとおりです。メインのユーザーインターフェイスから個別のプロセスを実行している場合は、外部プロセスで発生する可能性のあるあらゆる状況をカバーすることを絶対に確認してください。

記録のために、ニック・ゲレラはプロセスIDに向かって私を誘導するためのポイントに値します。それは最終的にそれを解決しました。

他のヒント

代わりにこれを試してください。

pdfView.Kill();
pdfView.WaitForExit();
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top