لماذا خطأ Raceonrcwcleanup عند إغلاق نموذج مع عنصر تحكم WebBrowser عليه؟

StackOverflow https://stackoverflow.com/questions/1874496

سؤال

VS2008، .NET 2، VB.NET، XP ...

لدي نموذج Windows، مع عنصر تحكم WebBrowser وزر إغلاق، وهذا فقط يفعل Me.Close. وبعد يتم تعيين زر إلغاء النموذج إلى الزر "إغلاق"، بحيث يمكنني ربط ESC بإغلاق النموذج.

أنا وضعت DocumentText خاصية التحكم WebBrowser في حدث التحميل، ويعرض HTML.

تشغيل التطبيق من Visual Studio، إذا قمت بالنقر فوق الزر "إغلاق"، يغلق النموذج بدون خطأ.

إذا ضربت زر ESC أحصل عليه

تم اكتشاف RaceonrcwCleanup رسالة: تم إجراء محاولة لتحرير RCW قيد الاستخدام. RCW قيد الاستخدام على مؤشر الترابط النشط أو مؤشر ترابط آخر. محاولة تحرير RCW للاستخدام يمكن أن يسبب الفساد أو فقدان البيانات.

إذا قمت بتشغيل التطبيق خارج VS، فلن أحصل على خطأ.

أي أفكار أ) لماذا الخطأ، و ب) كيفية منع أو قمعها؟

شكرا كثيرا مسبقا.

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

المحلول

ليس خطأ، إنه تحذير. ينتج بواسطة مساعد تصحيح الأخطاء المدار (MDA)، وهو ملحق لأصحاب المصحح للحصول على التعليمات البرمجية المدارة، التي تعتقد أنها ترى شيئا ما يحدث في التعليمات البرمجية الخاصة بك. حذاء يناسب. أنت تستخدم RCW، WebBrowser هو عنصر تحكم COM. أنت تقتل RCW، فأنت تغلق النموذج الخاص بك. خطوات MDA في لأنه يعتقد أنه يرى مستعرض الويب قيد الاستخدام وقتله قبل اكتمال الطلب. من شأنه أن يكون ذلك عادة معنى فقط إذا كنت تستخدم مؤشر ترابط في التعليمات البرمجية الخاصة بك.

هل أنت؟ إذا لم يكن كذلك، لا تفقد أي نوم فوقه. يستخدم COM عد النقاش، سيئة السمعة لعدم القدرة على حل المراجع الدائرية.


حسنا، حصلت على تأييد لهذا، ممكنة من التعليقات. نعم، يتم تشغيل ذلك بواسطة خاصية CancelButton النموذج أو الخاصية Dialogresult في الزر. يحدث هذا عندما يكون WB التركيز، يرى الضغط على مفتاح الهروب. جزء من السباكة ActiveX هو سرد الحاوية حول هذا الموضوع حتى تتمكن من الاستجابة لمضادات المفاتيح التي يجب أن يكون لها تأثير جانبي. مختصرة ضغطات المفاتيح، علامة التبويب، أدخل. والهروب. إذا تم إغلاق الزر ثم يغلق النموذج، يرى المصحح أن يتم التخلص من WB أثناء وجود إطارات مكدس نشطة من رمز RCW على المكدس. الخطر هو أن هذا قد يتسبب في تعطل عند إرجاع التعليمات البرمجية المسمى منذ إصدار مكون COM، فهذا غير شائع.

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

    private void CancelButton_Click(object sender, EventArgs e) {
        this.BeginInvoke((MethodInvoker)delegate { this.Close(); });
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top