System.InvalidOperationException: 'Объект в настоящее время используется в другом месте.' - PullRequest
1 голос
/ 17 июня 2020

У меня есть фоновый поток, генерирующий Bitmap, когда он готов к кадру, он вызывает событие OnRenderScreen, которое содержит байт [] с генерируемым изображением. Я копирую данные в _frame и делаю недействительным окно изображения, которое рисует фактическое растровое изображение внутри это клиентская область, она работает нормально, но если я разверну форму, я получаю System.InvalidOperationException: «Объект в настоящее время используется где-то еще». Я подозреваю, что это проблема при попытке внести изменения в поток пользовательского интерфейса из фонового потока, но не уверен, как это сделать правильно.

Мой текущий код:

    class Ui : Form
{
    Bitmap _frame;
    Thread _nesThread;

    private PictureBox pbRenderOutput;

    public Ui()
    {
        this._console = new Console();
        _console.OnRenderScreen += _console_OnRenderScreen;

        _frame = new Bitmap(256, 192, PixelFormat.Format32bppArgb);

    }

    private void _console_OnRenderScreen(object sender, RenderEventArgs e)
    {
        RenderScreen(e.FrameData);
    }

    private void RenderScreen(byte[] frameData)
    {
        BitmapData bmpData = _frame.LockBits(new Rectangle(0, 0, _frame.Width, _frame.Height), ImageLockMode.WriteOnly, _frame.PixelFormat);

        byte[] pixelData = new byte[bmpData.Stride * bmpData.Height];
        Buffer.BlockCopy(frameData, 0, pixelData, 0, pixelData.Length);

        Marshal.Copy(pixelData, 0, bmpData.Scan0, pixelData.Length);

        _frame.UnlockBits(bmpData);

        pbRenderOutput.Invalidate();
    }


    private void pbRenderOutput_Paint(object sender, PaintEventArgs e)
    {
        if (_frame != null)
        {
            e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
            e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
            e.Graphics.DrawImage(_frame, ClientRectangle, new Rectangle(0, 0, _frame.Width, _frame.Height), GraphicsUnit.Pixel);
        }
    }
}
...