異常消息是:位圖區域已被鎖定,它是在Program.cs中上線:爲什麼我在使用backgroundworker時出現異常InvalidOperationException?
Application.Run(new Form1());
例外與方法有關:如果我不使用BackgroundWorker get_images_with_clouds
而在Form1構造我所做的:
bitmaps = ImagesComparison.get_images_with_clouds(b);
這是工作正常,但當我做的BackgroundWorker的這條線做的工作時我得到這個例外。
一種新的形式設計師,我增加了一個新的backgroundworker1 在新的形式構造我所做的:
b = new Bitmap(InitGifFile);
pictureBox1.Image = b;
backgroundWorker1.RunWorkerAsync();
b是位圖變量,InitGifGile是可變的字符串
的異常,只有當開始我開始使用背景工作。 然後在BackgroundWorker的DoWork的事件我所做的:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bgw = (BackgroundWorker)sender;
if (bgw.CancellationPending == true)
{
}
else
{
bitmaps = ImagesComparison.get_images_with_clouds(b);
}
}
而且方法get_images_with_clouds:
public static Bitmap[] get_images_with_clouds(Bitmap radar_image)
{
int e = 0;
int f = 0;
int image_clock_area_x = 0;
int image_clock_area_y = 0;
int image_clock_area_x1 = 140;
int image_clock_area_y1 = 21;
Bitmap[] localImages;
localImages = new Bitmap[15];
Bitmap image;
image = new Bitmap(Properties.Resources.radar_without_clouds);
BitmapData bmD = null;
BitmapData bmD2 = null;
try
{
bmD = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
bmD2 = radar_image.LockBits(new Rectangle(0, 0, radar_image.Width, radar_image.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
IntPtr sc0 = bmD.Scan0;
unsafe
{
int* p = (int*)sc0.ToPointer();
int* p2 = (int*)bmD2.Scan0.ToPointer();
for (e = image_clock_area_x; e < image_clock_area_x + image_clock_area_x1; e++)
{
for (f = image_clock_area_y; f < image_clock_area_y + image_clock_area_y1; f++)
{
Color clock_color = Color.FromArgb(p2[e + f * bmD2.Width]);
p[e + f * bmD.Width] = clock_color.ToArgb();
}
}
}
image.UnlockBits(bmD);
radar_image.UnlockBits(bmD2);
}
catch
{
try
{
image.UnlockBits(bmD);
}
catch
{
}
try
{
radar_image.UnlockBits(bmD2);
}
catch
{
}
}
int c;
for (c = 0; c < localImages.Length; c++)
{
localImages[c] = new Bitmap(image);
}
Bitmap new_image = new Bitmap(Properties.Resources.radar_without_clouds);
Bitmap new_image1 = new Bitmap(Properties.Resources.radar_without_clouds);
Bitmap localbmptest = black_and_white(new_image, radar_image);
Image image1 = black_and_white(new_image, radar_image);
image1.Save(@"c:\temp\testclouds666.jpg");
Bitmap clouds = new Bitmap(image1);
int x;
int y;
int a;
int b;
int d = 0;
Bitmap redImage;
redImage = new Bitmap(512, 512);
using (Graphics g = Graphics.FromImage(redImage))
{
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
g.Clear(Color.Red);
}
BitmapData bmData = null;
BitmapData bmData2 = null;
BitmapData bmDataArray = null;
try
{
bmData = clouds.LockBits(new Rectangle(0, 0, clouds.Width, clouds.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
bmData2 = radar_image.LockBits(new Rectangle(0, 0, radar_image.Width, radar_image.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
IntPtr scan0 = bmData.Scan0;
IntPtr scan02 = bmData2.Scan0;
unsafe
{
int* p = (int*)scan0.ToPointer();
int* p2 = (int*)scan02.ToPointer();
double h, mm;
for (d = 0; d < localImages.Length; d++)
{
bmDataArray = localImages[d].LockBits(new Rectangle(0, 0, localImages[d].Width, localImages[d].Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
IntPtr scan0Array = bmDataArray.Scan0;
int* pArray = (int*)scan0Array.ToPointer();
for (a = 0; a < new_image.Width; a++)
{
for (b = 0; b < new_image.Height; b++)
{
Color color1 = Color.FromArgb(p[a + b * bmData.Width]);
Color color2 = Color.FromArgb(p2[a + b * bmData2.Width]);
if (color1.R != 0 || color1.G != 0 || color1.B != 0)
{
h = color2.GetHue();
mm = RadarAnalysis.Hue2MMPerHour(h);
if (mm >= treshhold_array[14 - d])
{
pArray[a + b * bmDataArray.Width] = color2.ToArgb();
}
}
}
}
localImages[d].UnlockBits(bmDataArray);
}
}
clouds.UnlockBits(bmData);
radar_image.UnlockBits(bmData2);
}
catch (Exception error)
{
try
{
clouds.UnlockBits(bmData);
}
catch
{
}
try
{
radar_image.UnlockBits(bmData2);
}
catch
{
}
try
{
localImages[d].UnlockBits(bmDataArray);
}
catch
{
}
Logger.Write("Error Exception ==> " + error);
MessageBox.Show("Error Exception ==> " + error);
}
return localImages;
}
完整的異常錯誤消息:
System.InvalidOperationException was unhandled
HResult=-2146233079
Message=Bitmap region is already locked.
Source=System.Drawing
StackTrace:
at System.Drawing.Graphics.CheckErrorStatus(Int32 status)
at System.Drawing.Graphics.DrawImage(Image image, Int32 x, Int32 y, Int32 width, Int32 height)
at System.Drawing.Graphics.DrawImage(Image image, Rectangle rect)
at System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
InnerException:
我不知道爲什麼在使用背景工作者使這個例外,但沒有背景工作者它在同一行工作正常。