私は現在私が作成しているアプリにウェブカメラの機能を実装していますが、メモリの使用に関するいくつかの問題がありました。これは、しかし、このコードが(私は仮定ラムの)2ギガバイトを実行して、巨大なメモリリークを引き起こした最初の実装C#ビットマップメモリの使用を処理する
private void webcam_newFrame(object sender, NewFrameEventArgs eventArgs) {
if (!_pause) {
var img = (Bitmap) eventArgs.Frame.Clone();
pbPicture.BackgroundImage = img;
}
}
ある
以下のように
私の関数です。メモリ不足のためにクラッシュする前に。 そう
private void webcam_newFrame(object sender, NewFrameEventArgs eventArgs) {
if (!_pause) {
var img = (Bitmap) eventArgs.Frame.Clone();
pbPicture.BackgroundImage = img;
img.Dispose(); // This causes exception
}
}
これは、例外がスローされた原因となるように私はその後、ビットマップを処分するためにコードを変更:System.Drawing.dllの「System.ArgumentExceptionの」。
追加情報:パラメータが無効です。表示されるためにこのフォームを呼び出して、次のコードで
:
WebcamForm wForm = new WebcamForm();
wForm.ShowDialog();
だから私はその後、これに機能を変更:
private void webcam_newFrame(object sender, NewFrameEventArgs eventArgs) {
if (!_pause) {
pbPicture.BackgroundImage = (Bitmap)eventArgs.Frame.Clone();
GC.Collect();
}
}
をこのコードは正しく動作し、メモリ使用量が360メガバイトの周りにいるまま一貫性があり、アプリケーションを考慮した合理的な数字です。
私の質問は、すべてのフレームにガベージコレクションを強制するのですか?潜在的な問題はありますか?
ガベージコレクションを強制することは悪いことですが、私はこの問題を回避する方法については考えていませんでした。あなたはあなたが渡している新しい価値、背景画像の古い値を配置する必要はありません。
private void webcam_newFrame(object sender, NewFrameEventArgs eventArgs) {
if (!_pause) {
var img = (Bitmap) eventArgs.Frame.Clone();
var oldImg = pbPicture.BackgroundImage;
pbPicture.BackgroundImage = img;
oldImg?.Dispose();
}
}
しかし、これはうんざりですが、元の質問に記載されているように、System.Drawing.dllエラーでSystem.ArgumentExceptionがスローされます。私はそれがGC.Collect()の実装を使用するとき、私はそのエラーを取得しないので、ビットマップを処分することによって発生したと信じています。デバッグするためにビジュアルスタジオを正しく取得することができないので、これ以上絞り込む方法がわかりません。 – Craig
これを無視して、PictureBox.BackgroundImageではなくPictureBox.Imageを使用して問題を解決してください。違いが出る理由はわかりませんが、解決策です – Craig