我正在編寫一個應用程序來使用CopyFromScreen
方法捕獲屏幕,並且還想保存捕獲的圖像以通過本地網絡發送。 因此,我試圖將捕獲的屏幕存儲在一個位圖上,並在兩個線程上保存另一個位圖,這是之前捕獲的屏幕。InvalidOperationException保存位圖並使用graphics.copyFromScreen並行-y
但是,這是拋出一個InvalidOperationException
,其中說對象目前正在其他地方使用。 System.Drawing.dll拋出異常。
我嘗試過鎖定,並使用單獨的位圖來保存和捕獲屏幕。我如何阻止這種情況發生?相關代碼:
Bitmap ScreenCapture(Rectangle rctBounds)
{
Bitmap resultImage = new Bitmap(rctBounds.Width, rctBounds.Height);
using (Graphics grImage = Graphics.FromImage(resultImage))
{
try
{
grImage.CopyFromScreen(rctBounds.Location, Point.Empty, rctBounds.Size);
}
catch (System.InvalidOperationException)
{
return null;
}
}
return resultImage;
}
void ImageEncode(Bitmap bmpSharedImage)
{
// other encoding tasks
pictureBox1.Image = bmpSharedImage;
try
{
Bitmap temp = (Bitmap)bmpSharedImage.Clone();
temp.Save("peace.jpeg");
}
catch (System.InvalidOperationException)
{
return;
}
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Interval = 30;
timer1.Start();
}
Bitmap newImage = null;
private async void timer1_Tick(object sender, EventArgs e)
{
//take new screenshot while encoding the old screenshot
Task tskCaptureTask = Task.Run(() =>
{
newImage = ScreenCapture(_rctDisplayBounds);
});
Task tskEncodeTask = Task.Run(() =>
{
try
{
ImageEncode((Bitmap)_bmpThreadSharedImage.Clone());
}
catch (InvalidOperationException err)
{
System.Diagnostics.Debug.Write(err.Source);
}
});
await Task.WhenAll(tskCaptureTask, tskEncodeTask);
_bmpThreadSharedImage = newImage;
}
它究竟在哪裏決定使用什麼東西? – BugFinder
我假設它是'_bmpThreadSharedImage'你沒有包含在上面導致問題的代碼中? – DavidG
@BugFinder異常未處理的消息出現在Program.cs中的Application.Run(new Form1())行,並且「CopyFromScreen」和「Bitmap.Save」方法突出顯示 – Priyank