私はビットマップがスレッドセーフではないことを知っているので、この回避策を使用します
Bitmap[] blobCopies = MakeBlobCopies(bmpBlob, 2);
BackgroundWorker bw1 = new BackgroundWorker();
bw1.DoWork += new DoWorkEventHandler(bw1_DoWork);
bw1.RunWorkerAsync(blobCopies[0]);
BackgroundWorker bw2 = new BackgroundWorker();
bw2.DoWork += new DoWorkEventHandler(bw2_DoWork);
bw2.RunWorkerAsync(blobCopies[1]);
DisposeBlobCopies(blobCopies);
Backgroundworkイベントハンドルで、ビットマップにいくつかのフィルターを適用しましたが、アクセス違反の例外が発生します
System.AccessViolationException was unhandled
Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Source=System.Drawing
StackTrace:
at System.Drawing.SafeNativeMethods.Gdip.GdipBitmapLockBits(HandleRef bitmap, GPRECT& rect, ImageLockMode flags, PixelFormat format, BitmapData lockedBitmapData)
at System.Drawing.Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format, BitmapData bitmapData)
at System.Drawing.Bitmap.LockBits(Rectangle rect, ImageLockMode flags, PixelFormat format)
私はビットマップを破棄していません(メモリの詰まりを避ける必要があります)。しかし、それでもこの例外が発生します。ワーカースレッドから何も返す必要はありません。これはすぐにこれに近づくことさえできますか?何か案は?
private Bitmap[] MakeBlobCopies(Bitmap originalBitmap, int n)
{
Bitmap[] blobCopies = new Bitmap[n];
for (int i = 0; i < n; i++)
{
blobCopies[i] = (Bitmap)originalBitmap.Clone();
}
return blobCopies;
}