سؤال

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

System.InvalidOperationException: BufferedGraphicsContext cannot be disposed of because a buffer operation is currently in progress.

at System.Drawing.BufferedGraphicsContext.Dispose(Boolean disposing)

at System.Drawing.BufferedGraphicsContext.Dispose()

at System.Drawing.BufferedGraphicsContext.AllocBufferInTempManager(Graphics targetGraphics, IntPtr targetDC, Rectangle targetRectangle)

at System.Drawing.BufferedGraphicsContext.Allocate(IntPtr targetDC, Rectangle targetRectangle)

at System.Windows.Forms.Control.WmPaint(Message& m)

at System.Windows.Forms.Control.WndProc(Message& m)

at System.Windows.Forms.ScrollableControl.WndProc(Message& m)

at System.Windows.Forms.ToolStrip.WndProc(Message& m)

at System.Windows.Forms.MenuStrip.WndProc(Message& m)

at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)

at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)

at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
هل كانت مفيدة؟

المحلول

هناك مناقشة طويلة جدًا في منتديات MSDN حول هذا الخطأ هنا.في معظم الحالات يرتبط الخطأ على ما يبدو بأي مما يلي:

  1. مشكلة OutOfMemory الأساسية، والتي تظهر كاستثناء BufferedGraphicsContext، ربما بسبب خطأ في إطار العمل.
  2. تسرب كائن GDI (إنشاء كائنات GDI وعدم التخلص منها).

أتذكر أنني رأيت هذا الخطأ بنفسي قبل عام أو نحو ذلك، وكان مرتبطًا بالتأكيد بمشكلة في الذاكرة جعلت تطبيقنا يملأ جميع الأجهزة الافتراضية المتاحة بعد فترة طويلة، لذلك يوافق رقم 1 على ما لاحظته.

نصائح أخرى

أعلم أن هذا السؤال قديم، ولكن واجهت نفس المشكلة واكتشفت أنه ظهر فقط عندما استخدمت عناصر تحكم متعددة نفذت التخزين المؤقت المزدوج اليدوي.

بالنسبة لي وجدت المشكلة في هذه المرحلة:

BufferedGraphicsContext _BackbufferContext = BufferedGraphicsManager.Current;

لذلك استخدمت جميع عناصر التحكم الخاصة بي ملف حاضِر السياق، الذي أفترض أنه هو نفسه دائمًا.بعد أن قمت باستبداله بـ

BufferedGraphicsContext _BackbufferContext = new BufferedGraphicsContext();

كل شيء يعمل كما يريد.

آمل أن يكون هذا مفيدًا قليلاً.

لقطة في الظلام - هل ترسم من خيوط متعددة؟إذا كنت تقوم بأعمال تتعلق بالرسم، فقم بذلك على مؤشر واجهة المستخدم الرسومية أو قم بمزامنة التعليمات البرمجية الخاصة بك بعناية.

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