Вам не хватает памяти и / или смежного адресного пространства.Последнее вполне вероятно, если вы находитесь в 32-битном процессе.Должна помочь правильная утилизация графики и растрового изображения, когда вы закончите.Также рассмотрите возможность повторного использования того же растрового изображения, если размер экрана не изменился.Растровое изображение размером с экран довольно большое.
Следующий код завершит работу с этим исключением после 30 итераций.
for (int i = 0; i < 500; i++)
{
new Bitmap(5000, 5000);
}
Это будет выполнено просто отлично, но это займет некоторое время и будет довольно расточительным.
for (int i = 0; i < 500; i++)
{
new Bitmap(5000, 5000).Dispose();
}
Обновление: Из ваших правок я вижу, что вы не избавляетесь от графического объекта.Вы также должны определенно повторно использовать растровое изображение и графику, как это
private async Task Foo(CancellationToken cancel)
{
using (var bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height))
using (var graphics = Graphics.FromImage(bitmap))
{
while (true)
{
cancel.ThrowIfCancellationRequested();
graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size, CopyPixelOperation.SourceCopy);
ProcessImage(bitmap);
await Task.Delay(200);
}
}
}