PictureBoxのImageに非同期で画像を読み込むサンプル

C# コンピュータ
C#
ファイルサイズの大きな画像ファイルをPictureBoxで表示する場合、ファイルを読み込み画像が表示するまでの間UIがロックされないように非同期処理を試してみたいと思います。
namespace AsyncBitmap;

public partial class Form1 : Form
{
    FlowLayoutPanel _basePanel = new()
    {
        Dock = DockStyle.Fill,
    };
    PictureBox _picbox = new()
    {
        Size = new Size(512, 384),
        SizeMode = PictureBoxSizeMode.Zoom,
    };
    Button _syncButton = new()
    {
        Text = "同期",
        AutoSize = true,
    };
    Button _asyncButton = new()
    {
        Text = "非同期",
        AutoSize = true,
    };
    public Form1()
    {
        InitializeComponent();
        this.Load += Form1_Load;
    }
    void Form1_Load(Object? o, EventArgs e)
    {
        _basePanel.Controls.AddRange(new Control[]
        {
            _picbox,
            _syncButton,
            _asyncButton,
        });
        this.Controls.Add(_basePanel);
        _basePanel.SetFlowBreak(_picbox, true);

        var path = @"読み込む画像ファイルのパス";

        _syncButton.Click += (s, e) =>
        {
            Task.Delay(1000).Wait();

            using var fs = new FileStream(path, FileMode.Open, FileAccess.Read);
            Image img = Bitmap.FromStream(fs);

            _picbox.Image?.Dispose();
            _picbox.Image = img;
        };

        _asyncButton.Click += async (s, e) =>
        {
            await Task.Delay(1000);

            using var fs = new FileStream(path, FileMode.Open, FileAccess.Read);
            Image img = await Task.Run(()=>Bitmap.FromStream(fs));

            _picbox.Image?.Dispose();
            _picbox.Image = img;
        };
    }
}

「同期」ボタンを押すと画像が表示されるまで、ボタンなどのUIがロックされます。(Task.Delay()でウエイトを入れています。)
「非同期」ボタンの場合はロックされません。
一応思った通りになりましたが、これでよいのか…もっと調べてみたいと思います。

コメント