每一秒,我使用以下代码捕获我的屏幕。第一次40/50次工作,之后我在第一行和第三行代码获得InvalidArgumentException
。
Bitmap bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics g = Graphics.FromImage(bmpScreenshot);
g.CopyFromScreen(0, 0, 0, 0, Screen.PrimaryScreen.Bounds.Size);
bmpScreen = bmpScreenshot;
答案 0 :(得分:2)
可能需要丢弃一些物品。
很难从所显示的代码中分辨出来,但我的猜测是你没有正确处理对象并且内存不足。我确信应该处理Graphics
个对象,并且当你完成它时,可能还需要处理位图。根据设置错误捕获的方式,如果吞下内存不足异常并继续运行,则不会实例化不适合可用内存的新对象,并且它们的构造函数将返回null。如果然后将null传递给不希望接收null的方法,则可能会导致InvalidArgumentException
。
答案 1 :(得分:0)
尝试在using
语句中包装Disposable对象。我能够使用以下代码重新解决您的问题:
public static void Main()
{
var i = 1;
while (true)
{
var screenSize = Screen.PrimaryScreen.Bounds.Size;
try
{
var bmpScreenshot = new Bitmap(screenSize.Width, screenSize.Height);
var g = Graphics.FromImage(bmpScreenshot);
g.CopyFromScreen(0, 0, 0, 0, screenSize);
}
catch (Exception e)
{
Console.WriteLine("Exception ignored: {0}", e.Message);
}
finally
{
Console.WriteLine("Iteration #{0}", i++);
Thread.Sleep(TimeSpan.FromSeconds(1));
}
}
}
通过使用声明包装一次性用品,问题不会再次发生:
public static void Main()
{
var i = 1;
while (true)
{
var screenSize = Screen.PrimaryScreen.Bounds.Size;
try
{
using (var bmpScreenshot = new Bitmap(screenSize.Width, screenSize.Height))
using (var g = Graphics.FromImage(bmpScreenshot))
{
g.CopyFromScreen(0, 0, 0, 0, screenSize);
}
}
catch (Exception e)
{
Console.WriteLine("Exception ignored: {0}", e.Message);
}
finally
{
Console.WriteLine("Iteration #{0}", i++);
Thread.Sleep(TimeSpan.FromSeconds(1));
}
}
}