CopyFromScreen
メソッドを使用して画面をキャプチャするアプリケーションを作成していて、キャプチャした画像を保存してローカルネットワーク経由で送信します。 キャプチャされた画面を1つのビットマップに保存し、もう1つのビットマップ(以前にキャプチャした画面)を2つのスレッドに保存しようとしています。ビットマップを保存してgraphics.copyFromScreen parallel-yを使用しているときにInvalidOperationExceptionが発生しました
しかし、これはInvalidOperationException
を投げています。オブジェクトは現在、他の場所で使用されています。例外はSystem.Drawing.dllによってスローされます。
私はロックを試みて、画面を保存してキャプチャするために別々のビットマップを使用しています。これをどうやって止めるのですか?関連コード:私はのC#のコードので、私はここで間違っているかもしれませんが、私はWindowsを使用していると仮定
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