سؤال

حسنا، إليك الصفقة ...

لدي برنامج Windows (XP) في .NET 2.0 (C #) الذي يسمح للمستخدمين بإعادة تسمية ملف .pdf معين. (اسم الملف "وصفي هيكليا"، لأنه يضع معلومات بسيطة حول ما هو في الملف نفسه.) على النموذج الوحيد للبرنامج، هناك كائن LinkLabel الذي يسمح للمستخدم بفتح .PDF نفسه، بحيث يمكنهم رؤيته ما يرسمونه.

الحيلة هي أنه عندما يقوم المستخدم بإجراء التغيير (التغييرات) المناسب والنقر فوق الزر "حفظ"، أريد نافذة Acrobat التي تعرض .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 ()، مع InvalidOperationExceptionException، تخرج العملية = "هذه المعلومات غير متوفرة". سيكون هذا واضحا إلى حد ما إذا لم يكن لصالح شيئين ...

1: pdfview.hasexited = صحيح

و

2: عارض PDF المجريبي لا يزال مفتوحا !!!

كيف في العالم ممكن؟ هل هناك أمر عملية يجب أن أستخدمه لضمان إغلاق النافذة؟ FYI، يشير البرنامج إلى شيء خارج إما النظام. * أسماء الأسماء، أو الطبقة المبنية داخليا والتي تراجع أيضا النظام فقط. *.

شكرا.

هل كانت مفيدة؟

المحلول 2

بعد مزيد من التحقيق، أعتقد أنني قررت ما كان يحدث.

لم أفصل تفاصيل سير العمل لأنني لم أستطع تكرار الوضع بشكل موثوق. بعد محاولات أخرى، وجدت مواقف موثوقة ...

  1. انقر فوق الارتباط عدة مرات ثم انقر فوق حفظ.
  2. انقر على الرابط، وإغلاق نافذة المشاهد، وانقر فوق حفظ.

في كل من هذه الحالات، فإن المشكلة المغلي لأسفل في العملية المدفوعة إلى PDFViewer أصبحت خارج المزامنة بما كان عليه المستخدم.

  1. إذا تم النقر فوق الرابط على عدة مرات، فقد كان العارض النشط في عملية غير متصلة بعملية PDFViewer، وبالتالي الوضع المستحيل على ما يبدو مفصلا أعلاه.

  2. إذا تم النقر فوق الارتباط عند إغلاق النافذة، فسيظل متغير PDFViewer، مما يترك عملية مع HAREXITE = TRUE.

خذ الدرس المنزلي من كل هذا كما يلي: إذا كنت تقوم بتشغيل عملية منفصلة من واجهة المستخدم الرئيسية، فستكون متأكدا تماما من أن تغطي كل موقف ممكن يمكن أن يحدث مع العملية الخارجية.

بالنسبة للسجل، يستحق نيك جيريرا نقاطا لتوجيهي نحو معرفات العملية. هذا حلها في نهاية المطاف.

نصائح أخرى

جرب هذا بدلا من ذلك ..

pdfView.Kill();
pdfView.WaitForExit();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top