Является ли Graphics.DrawImage асинхронным? - PullRequest
3 голосов
/ 14 июня 2010

Мне просто интересно, а Graphics.DrawImage() асинхронный? Я борюсь с проблемой безопасности потоков и не могу понять, где проблема.

если я использую следующий код в потоке GUI:

protected override void OnPaint(PaintEventArgs e)
{
   lock (_bitmapSyncRoot)
   {
      e.Graphics.DrawImage(_bitmap, _xPos, _yPos);
   }
}

И иметь следующий код в отдельном потоке:

private void RedrawBitmapThread()
{
   Bitmap newBitmap = new Bitmap(_width, _height);
   // Draw bitmap //

   Bitmap oldBitmap = null;
   lock (_bitmapSyncRoot)
   {
      oldBitmap = _bitmap;
      _bitmap = newBitmap;
   }
   if (oldBitmap != null)
   {
      oldBitmap.Dispose();
   }
   Invoke(Invalidate);
}

Может ли это объяснить исключение нарушения прав доступа?

Код работает на устройстве Windows Mobile 6.1 с компактной платформой 3.5.

Edit:

Неважно, это происходит также, когда методы выполняются в одном потоке ..

Ответы [ 2 ]

1 голос
/ 14 июня 2010

Да, синхронно. Но вы делаете большие предположения в этом коде, вы предполагаете, что создание любого объекта Graphics является поточно-ориентированным. Афаик это на десктопной версии GDI +. Это не было бы так вероятно на ОС с ограниченными ресурсами, такой как WM. Ничто из того, что вы можете заблокировать, не используется для рисования в коде, к которому вы не можете прикоснуться.

0 голосов
/ 14 июня 2010

Ну, DrawImage не асинхронный.Фреймворк автоматически не сделает его асинхронным.Кроме того, большинство всех асинхронных операций в .NET начинаются с 'Begin', просто для справки.

Я не уверен, откуда исходит ваша ошибка, но вы можете:из какой строки выдается исключение AccessViolationException?

убедитесь, что _bitmapSyncRoot инициализирован?
...