Ich weiß, diese Frage vor gefragt wurde, aber meine Frage bezieht sich direkt ‚Stretch‘ (oder etwas anderes als ‚Normal‘) mit dem picturebox zu verwenden, ‚Normal‘ funktioniert perfekt.C# Picturebox Strecke Speicherprobleme
Ich habe eine einfache Anwendung, die im Wesentlichen einem Screenshot 60 mal pro Sekunde _timer.Interval = (1.0/60.0) * 1000.0;
mit Timer nimmt. Unglücklicherweise verursacht die Verwendung von "Stretch" mehr und mehr Speicher, der schließlich die Anwendung zum Absturz bringt.
public partial class Form1 : Form
{
System.Timers.Timer _timer = new System.Timers.Timer();
public Form1()
{
InitializeComponent();
_timer.Elapsed += new ElapsedEventHandler(OnElapsed);
_timer.Interval = (1.0/60.0) * 1000.0;
}
private void btnCapture_Click(object sender, EventArgs e)
{
_timer.Enabled = true;
}
private void OnElapsed(object o, ElapsedEventArgs e)
{
Rectangle bounds = Screen.PrimaryScreen.Bounds;
Bitmap bmp = new Bitmap(bounds.Width, bounds.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
g.CopyFromScreen(0, 0, 0, 0, new Size(bounds.Width, bounds.Height));
using (Image prev = pbCapture.Image)
{
pbCapture.Image = bmp;
}
}
}
}
Wie Sie sehen können, ich entsorgen beiden Grafiken IDisposable und dem vorhergehenden Bild von der picturebox verwendet. Der Speicher erhöht sich jedoch immer noch.
Gibt es etwas, was ich falsch mache?
Wo ist 'bmp' angeordnet? –
Wenn ich versuche, bmp zu disponentieren, wird eine Ausnahme für 'ungültiger Parameter' auf .CopyFromScreen verursacht. – Daniel
Die Bitmap muss entsorgt werden - Sie könnten versuchen, einen anderen Verweis auf die Bitmap zu erhalten, kurz bevor Sie pbCapture.Image zuweisen und dann löschen. Ich sehe @PatrickArtner mich schlagen, dies zu sagen. – PaulF