[ad_1]
我有几个 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
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(); }
[ad_2]
コメント