سؤال

يتسبب التعليمة البرمجية التالية في حدوث عطل متقطع على جهاز يعمل بنظام التشغيل Vista.

using (SoundPlayer myPlayer = new SoundPlayer(Properties.Resources.BEEPPURE))
     myPlayer.Play();

أظن بشدة أن هذا هو الرمز لأن البرنامج يتعطل في منتصف صوت التنبيه أو قبل تشغيل صوت التنبيه في كل مرة.لدي مصائد عالية المستوى للجميع ThreadExceptions, UnhandledExceptions في مجال التطبيق الخاص بي، و try-catch حول Application.Run, ، لا شيء منها يحبس هذا الانهيار.

أيه أفكار؟


يحرر:

يحتوي عارض الأحداث على المعلومات التالية:

تطبيق Faulting [XYZ] .exe ، الإصدار 4.0.0.0 ، طابع زمني 0x48CE5A74 ، وحدة التصدع msvcrt.dll ، الإصدار 7.0.6001.18000 ، ختم الوقت 0x4791a727 ، رمز الاستثناء 0xc00005 ٪ 10.

ومن المثير للاهتمام أن HRESULT 0xc0000005 لديه الرسالة:

"القراءة أو الكتابة إلى موقع ذاكرة لا يمكن الوصول إليها." (status_access_violation)

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

المحلول

في الواقع، الكود أعلاه (أي new SoundPlayer(BEEPPURE)).Play();كان يتعطل بالنسبة لي.

تشرح هذه المقالة السبب، وتوفر بديلاً لـ SoundPlayer الذي يعمل بشكل لا تشوبه شائبة:

http://www.codeproject.com/KB/audio-video/soundplayerbug.aspx?msg=2862832#xx2862832xx

نصائح أخرى

يمكنك استخدام WinDBG واحتجاز كافة استثناءات الفرصة الأولى.أنا متأكد من أنك سترى شيئًا مثيرًا للاهتمام.إذا كان الأمر كذلك، يمكنك استخدام SOS لتنظيف المكدس ونشره هنا لمساعدتنا.

أو يمكنك استخدام Visual Studio عن طريق تمكين تعويض كافة الاستثناءات.انتقل إلى "تصحيح الأخطاء" ثم "الاستثناءات" وتأكد من محاصرة كل شيء.قم بذلك مع تحويل مصحح الأخطاء إلى الوضع المختلط (المُدار وغير المُدار).

بمجرد حصولك على تتبع المكدس، يمكننا تحديد الإجابة.

لا يتم إنهاء العملية على Windows بدون استثناء.إنه هناك.قد ترغب أيضًا في التحقق من سجل الأحداث الخاص بالجهاز لمعرفة ما إذا كان قد ظهر أي شيء.

يعرض عارض الحدث Hresult 0xC0000005 "القراءة أو الكتابة إلى موقع ذاكرة لا يمكن الوصول إليها." (status_access_violation)

راجع تعديلي أعلاه لمزيد من التفاصيل؛يستغرق إعادة إنتاج هذا بعض الوقت لذا لا يمكنني الحصول على ملف تفريغ جديد لـ WinDBG لفترة قصيرة.

الحل هو استخدام Microsoft.VisualBasic.Devices الذي لا يعاني من هذا الخطأ.نظرًا لأنه نظام التشغيل Vista فقط، وقد تمكن "عارض الأحداث" من الفشل في منتصف الطريق من خلال تسجيل التعطل (يجب أن يحتوي معرف العملية 0x**%9** على قيمة سداسية عشرية هناك بدلاً من ذلك)، فإنني أوجه اللوم إلى رمز الصوت الجديد في نظام التشغيل Vista.

راجع للشغل، ربط مصحح أخطاء VS بعملية التعطل عن بعد تمكن من تعليق Visual Studio أولاً، ثم التسبب في الموت الزرقاء على جهازي أثناء قتل devenv.exe غير المستجيب.رائع!

مجرد تكهنات هنا، ولكن المشكلة قد تكمن في عبارة الاستخدام.الكود الخاص بك هو مثل هذا (على ما أعتقد):

using (SoundPlayer myPlayer = new SoundPlayer(BEEPPURE))
{    
    myPlayer.Play();
}

ستستدعي كتلة الاستخدام Dispose() على myPlayer، أحيانًا قبل الانتهاء من تشغيل الصوت (ولكن نادرًا، لأن الصوت قصير جدًا - مع صوت أطول، أراهن أنه يمكنك إعادة إنتاج الخطأ في كل مرة).سيكون الخطأ نتيجة لمحاولة واجهة برمجة تطبيقات Windows (التي يغلفها SoundPlayer) تشغيل مخزن مؤقت تم التخلص منه بالفعل بواسطة .NET.

أعتقد أنه إذا قمت بذلك:

SoundPlayer myPlayer = new SoundPlayer(BEEPPURE);
myPlayer.Play();

او حتى

(new SoundPlayer(BEEPPURE)).Play();

لن ترى الخطأ بعد الآن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top