ما الذي يسبب ObjectDisposeException من SerialPort أثناء تصحيح أخطاء .NET winform؟

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

سؤال

Vista SP1 Visual Studio 2008 SP1 .NET 3.5 SP1 C#

لدي تطبيق winforms الذي ألعب به والذي يستخدم كائن SerialPort كمتغير خاص.عندما يتم تجميع التطبيق وتنفيذه، فإنه يعمل بشكل رائع.كما أنه يعمل في وضع التصحيح بدون أي نقاط توقف.في 90% من الأوقات عندما أتوقف عند نقطة توقف وأحاول التنقل خلال التعليمات البرمجية، أحصل على مربع حوار "حدث استثناء غير معالج" يتضمن هذه التفاصيل:

System.ObjectDisposedException كان غير معبأ = "تم إغلاق المقبض الآمن" Source = "mscorlib" ObjectName = "" StackTrace:في microsoft.win32.win32native.setevent (مقبض Safewaithandle) في System.Threading.eventwaithandle.set () في system.io.ports.serialstream.asyncfscallback (uint32 errorcode ، uint32 numbytes ، nativeOverled* foverlapped) at System.Thoring._IOCOPBACK. performiOcplessionCallback (UINT32 errorcode ، uint32 numbytes ، nativeOverled* poverlap) inserexception:

الشيء المحبط هو أنني لست مضطرًا إلى تجاوز التعليمات البرمجية ذات الصلة بالتسلسل!أنا فقط يجب أن أفعل شئ ما مع الميناء.لذلك قد أقرأ سلسلة، وأتعامل مع السلسلة، وأضيف رقمين معًا، أيًا كان، ثم BANG.

مرة أخرى، يعمل هذا بشكل جيد عند عدم تصحيح الأخطاء، أو عند تصحيح الأخطاء بدون أي نقاط توقف.يبدو أن هناك شيئًا ما يتعلق بالتوقف عند نقطة توقف يجعل CLR يتخلص من SerialStream على مؤشر ترابط مختلف.

هناك الكثير من الأحاديث عبر الإنترنت حول مشاكل تجديد أجهزة USB التي تسبب ذلك.لكنني أستخدم منفذ اللوحة الأم المدمج في COM1.

لا أعتقد أنني واجهت هذه المشكلة في .NET 2.0 لذا قد أضطر إلى العودة إلى ذلك...

أحتاج إلى تبسيط التطبيق قليلاً قبل أن أتمكن من نشر التعليمات البرمجية - ولكن هل رأى أي شخص سلوكًا كهذا في مصحح الأخطاء من قبل؟

ًشكراً جزيلا!

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

المحلول

لقد واجهت نفس المشكلة هذا الصباح فقط.والمثير للدهشة أنه قد اختفى عندما قمت بتعطيل الخيارات التالية في أدوات VS2008->خيارات->تصحيح الأخطاء->عام:

  • "تمكين مساعد الاستثناء"
  • "تمكين التنقل بين مصدر .NET Framework"
  • "التخطي على الخصائص والمشغلين"
  • "تمكين تقييم الخاصية واستدعاءات الوظائف الضمنية الأخرى"

ليس لدي أي فكرة عن السبب، لكنه نجح بالنسبة لي.

نصائح أخرى

ربما يتم إغلاق المنفذ الخاص بك بواسطة نظام التشغيل لأنه لا يحصل على استجابة من التطبيق الخاص بك (يتم إيقافه عند نقطة توقف).

حسنًا، لست متأكدًا من أن هذه إجابة، ولكن كان هناك بالتأكيد شيء ما حول هذا المشروع.تمت كتابته في الأصل بالإصدار 2.0 وتم تحويله إلى 3.5 بواسطة VS2008.لقد قمت بإنشاء مشروع جديد في C#-Express 2008 بإضافة الفئات الأصلية واحدة تلو الأخرى وهو يعمل كالسحر الآن!لا فكرة عما هو مختلف.

لدي هذا أيضا.يجب أن يكون هذا نوعًا من الأخطاء في مصحح الأخطاء.عملت النصيحة المذكورة أعلاه:قم بتعطيل "تمكين تقييم الخاصية واستدعاءات الوظائف الضمنية الأخرى."

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

واجهت نفس المشكلة وقمت بما يلي:

serialPortLock = Monitor.TryEnter(serialPort, 3000);
Thread.Sleep(5);
serialPort.Write(msg, 0, msg.Length);

والشيء نفسه بالنسبة لقراءة ().يبدو أنه حل جيد بالنسبة لي!

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