2018年9月9日 星期日

【C#】IProgress

IProgress 是類似輕量化版的 BackgroundWorker

它沒有 IsBusy, WorkComplete 事件等,要自己做,但我覺得比較直觀,貌似對 async 的支援也好點。
public partial class Form1 : Form
{
    IProgress<int> _progress;
    public Form1()
    {
        InitializeComponent();

        _progress = new Progress<int>(UpdateProgressBar);
    }

    private void UpdateProgressBar(int val)
    {
        pbProgress.Value = val;

        if (val == 100)
        {
            MessageBox.Show("Finished");
            pbProgress.Value = 0;
        }
    }

    private async void btnStart_Click(object sender, EventArgs e)
    {
        if (pbProgress.Value == 0)
        {
            await Task.Run(async () =>
            {
                for (int i = 0; i < 100; i++)
                {
                    _progress.Report(i + 1);
                    await Task.Delay(100 - i);
                }
            });
        }
    }
}

ref: GitHub 範例(Form2是 backgroundworker,可以在 program 切換)

沒有留言:

張貼留言