C# task.run() 不更新进度条

编程


我有几个 csv 文件、将文件转换为 DataTable 和数据集以收集所有表的函数。 我尝试为每个文件异步运行任务,并在完成时增加 ProgressBar 的值,但当所有任务完成时,progressBar 不会更新。 我想在每个任务完成后增加该值。 您能帮我解决这个问题吗?

我尝试过的:

List<string> files = new();
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    files.AddRange(openFileDialog1.FileNames);
}

Task<DataTable?>[] tasks = new Task<DataTable?>[files.Count];
for (int currentTask = 0; currentTask < files.Count; currentTask++)
{
    string file = files[currentTask];
    tasks[currentTask] = Task.Run(() =>
    {
        DataTable? tbl = CSVtoDataTable(file);
        progressBar1.BeginInvoke(() => progressBar1.Value++);
        return tbl;
    });

}
Task.WaitAll(tasks);

DataSet dts = new DataSet();

foreach (var task in tasks)
{
    dts.Tables.Add(task.Result);
}

解决方案1

不要调用进度栏,而是使用 IProgress 接口(系统)| 微软学习[^] 通过事件向 GUI 线程报告进度:

C#
private async void MyButton_Click(object sender, EventArgs e)
    {
    showProgress.Show();
    IProgress<int> progress = new Progress<int>(value => showProgress.Value = value);
    await Task.Run(() =>
    {
        for (int i = 0; i != 100; ++i)
            {
            progress.Report(i);
            Thread.Sleep(100);
            }
    });
    showProgress.Hide();
    }

コメント

タイトルとURLをコピーしました