Скорее всего, проблема в том, что общий ресурс - растровое изображение - не защищен блокировкой в примере кода. Блокировка должна обернуть вызовы LockBits
и UnlockBits
, чтобы обеспечить одновременный доступ к экземпляру Bitmap
.
В этом случае я бы посоветовал использовать фактический экземпляр Bitmap
в качестве объекта блокировки, поскольку это то, что необходимо защищать от одновременного доступа из разных потоков.
Блокировка на typeof(ClassA)
рекомендуется только при использовании блокировок внутри статических методов.
Обратите внимание, что блокировки - это взаимоисключающие блокировки, и другие потоки будут приостановлены, пока одна нить приобрела блокировку. Если большая часть времени будет потрачена внутри блокировки, параллелизация не принесет никаких преимуществ, если у вас будет несколько потоков.
В случае исключения блокировка будет снята с помощью конструкции блокировки, тогда как метод UnlockBits
обычно не вызывается. Если исключение может быть сгенерировано и перехвачено, я бы рекомендовал вызвать метод UnlockBits
из блока finally. Примерно так:
private Bitmap _bitmap;
public void foo()
{
lock (_bitmap)
{
BitmapData data;
try
{
data = _bitmap.LockBits(area, ImageLockMOde.ReadOnly, pixelFormat);
UseBitmapData(data);
}
finally
{
_bitmap.UnlockBits(data);
}
}
}
Эта логика также может быть включена в собственный класс, реализующий интерфейс IDisposable, позволяющий использовать мощную конструкцию using
.