利用可能な画像のリストから画像を選択し、対応する画像をPictureBoxに表示できるwinformsアプリケーションがあります。画像は非常に巨大で、最低10MBです。これにより、画像が読み込まれている間は、UIの残りの部分が反応しなくなります。画像がスムーズにロードし、UIもアクセスすることができ、この後PictureBoxに割り当てられたErrorImageが間違って表示されない
private void SetViewerImage()
{
if (pictureBox1.Image != null)
pictureBox1.Image.Dispose();
pictureBox1.Image = new Bitmap(/*Some stream*/);
}
:
private void LoadImage()
{
// loadViewerThread is a Thread object
if (loadViewerThread != null && loadViewerThread.IsAlive)
{
loadViewerThread.Abort(); // Aborting the previous thread if the user has selected another image
}
loadViewerThread = new Thread(SetViewerImage);
loadViewerThread.Start();
}
SetViewerImage機能は以下の通りである:だから、私は、次のコードを使用して、別のスレッド上に画像をロードすると考え。 しかし、ユーザーが一連の画像の間を非常に高速に動くと、大きな赤いXマークが表示されます。これは、Disposeの呼び出しがSetViewerImageにあるために発生します。
私はPictureBoxにErrorImageを割り当てましたが、この場合はErrorImageが表示されません。
質問:
- は私のスレッド実装に何か問題はありますか? イメージが廃棄されるのはなぜですか?
- 私は別のErrorImageを表示でき、 赤いXを表示できない方法はありますか?
を処分するための最も安全な方法を'pb.Image'はこれです:' if(...){Image temp = pictureBox1.Image; pictureBox1.Image = null; temp.Dispose(); } 'それが役立つかどうかは分かりませんが、それは最初のステップです。 - また、あなたは' InitialImage'プロパティに気付きましたか? - 最後に、イメージの読み込みが完了するまでリストを無効にすることを検討してください。 – TaW
Imageプロパティをnullに設定すると、ピクチャボックスは空白になり、カスタムErrorImageは表示されません。私は画像のリストを無効にすることはできません。私の場合、ユーザーは画像間を移動することが許されるべきです。 –
_ Imageプロパティをnullに設定すると、ピクチャボックスは空白になり、カスタムErrorImageは表示されません._もちろん、なぜでしょうか? Nullはエラーではなく、空のPBだけです。リストを無効にしたくない場合でも、ImageLoadedイベントに達するまで、新しいイメージが選択されたときに実行中のスレッドを無効にしたり、中止したりしようとします。 – TaW