c#, Graphics.DrawString(), InvalidOperationException

369
27 ноября 2017, 15:41

Столкнулся с InvalidOperationException: В данный момент объект используется другим процессом.

У меня есть форма и таймер, который ее обновляет.

Исключение возникает через некоторое время только при вызове метода Graphics.DrawString() с любыми аргументами.

Текст исключения:

System.InvalidOperationException: В данный момент объект используется другим процессом.
в System.Drawing.Graphics.CheckErrorStatus(Int32 status)
в System.Drawing.Graphics.DrawString(String s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format)
в System.Drawing.Graphics.DrawString(String s, Font font, Brush brush, Single x, Single y)
в WindowsFormsApplication5.Display.Display_Paint(Object sender, PaintEventArgs e) в C:\Users\admin\Documents\Visual Studio 2015\Projects\WindowsFormsApplication5\WindowsFormsApplication5\Display.cs:строка 33
в System.Windows.Forms.Control.OnPaint(PaintEventArgs e)
в System.Windows.Forms.Form.OnPaint(PaintEventArgs e)
в System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
в System.Windows.Forms.Control.WmPaint(Message& m)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ScrollableControl.WndProc(Message& m)
в System.Windows.Forms.Form.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Это при том, что потоки я не использую. По всей видимости в формах по дефолту есть два потока, которые одновременно просят перерисовать форму.

Форма:

    public partial class Display : Form {
        private double x, y;
        private long time;
        public Display() {
            Bundle.init();
            InitializeComponent();
            DoubleBuffered = true;
        }
        private void timer_Tick(object sender, EventArgs e) {
            Invalidate();
        }
        private void Display_Paint(object sender, PaintEventArgs e) {
                Graphics g = e.Graphics;
                g.DrawString("Test", Bundle.menuFont, Brushes.Black, Width / 2 - 195, Height / 2 + 55);
        }
    }

Ресурсы:

 public class Bundle {
    public static Bitmap logo { get; set; }
    public static Bitmap background { get; set; }
    public static Font menuFont { get; set; }
    public static Bitmap wall { get; set; }
    public static Bitmap floor { get; set; }
    public static Bitmap car { get; set; }
    public static Bitmap[] oil { get; set; }
    public static Bitmap oilpath { get; set; }
    public static void init() {
        logo = new Bitmap("../../Images/logo.png");
        background = new Bitmap("../../Images/background.png");
        PrivateFontCollection f = new PrivateFontCollection();
        f.AddFontFile("../../Images/Upheaval.otf");
        menuFont = new Font(f.Families[0], 24);
    }
}

Почему я ловлю исключение именно после вызова DrawString()? Все остальные методы Graphics работают идеально.

Как решить эту проблему? Она очень сильно мешает.

READ ALSO
Событие на нажатие кнопки мыши вне элемента управления. C#. Windows Forms

Событие на нажатие кнопки мыши вне элемента управления. C#. Windows Forms

Как обработать событие одиночного и двойного нажатия кнопки мыши за границами элемента управления? Все события нажатия кнопки мыши привязаны...

340
как работать с longpoll vk в c#

как работать с longpoll vk в c#

не могу понять как это делатьтоесть обновлять инфу в активном времени

217
запуск кода в отдельном потоке c#

запуск кода в отдельном потоке c#

как запустить этот код в отдельном потоке?

221
WCF Сервис для доступа к базе данных через EntityFramework

WCF Сервис для доступа к базе данных через EntityFramework

Я бы хоте посоветоваться с вамиСмотрите, такая ситуация, я создал отдельно бд и сгенерил dbmx используя Entity Framework (Database First)

200