質問内容
C# windows formでlistviewのリストをクリックすると画像のプレビューが表示される処理を作りたいのですが、画像をビットマップに変更してピクチャーボックスコンポーネントに渡す処理を非同期で実行しますが、別のリストをクリックしたときに、今の表示処理中、また表示中のものを削除して、今クリックしたものを表示させるように処理を作りたいです。
問題
lstFile_Click
をクリックし続けるとその分タスクが増えてしまいます。
現状
重い画像と軽い画像が来た時に処理時間の問題で表示がおかしくなります。
知りたいこと
表示処理中に別のリストをクリックしたときに、今、表示処理中のものをキャンセルして
今クリックしたものを表示したい、
処理中はロード中といった文字を表示させる予定です。
非同期の理由
大きい画像だと、プレビューの表示に時間がかかってまい、UIがフレーズするので
非同期にしています
試したこと
変数を用意して、クリックするたびにタスクが増えてしまう現象を対処に挑戦
ソースコード
cs
1 2 bool isNext = false; 3 bool isNow = false; 4 private async Task setPicturePreview(string filePath) 5 { 6 isNow = true; 7 MagickImage image = new MagickImage(filePath); 8 image.Resize(picPreview.Size.Width,picPreview.Size.Height); 9 bitmap = image.ToBitmap(); 10 bitmap.RotateFlip(RotateFlipType.Rotate90FlipNone); 11 picPreview.Image = new Bitmap(bitmap); 12 13 image.Dispose(); 14 15 if(isNext == true) 16 { 17 picPreview.Image = null; 18 19 setPicturePreview(lstFile.SelectedItems[0].Text.ToString()); 20 isNow = false; 21 isNext = false; 22 } 23 24 25 } 26 27 28 private void lstFile_Click(object sender, EventArgs e) 29 { 30 if(lstFile.SelectedItems.Count == 1) 31 { 32 if(isNow == true) 33 { 34 isNext = true; 35 } 36//////////////////////////////////////////////////////////////////////////////////////////////////// 37 if(isNext == false) 38 { 39 setPicturePreview(lstFile.SelectedItems[0].Text.ToString()); 40 } 41//////////////////////////////////////////////////////////////////////////////////////////////////// 42 } 43 44 }

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。