[ad_1]
Tengo varios archivos csv, una función que convierte el archivo a DataTable y un conjunto de datos para recopilar todas las tablas. Intenté ejecutar la tarea de forma asincrónica para cada archivo e incrementar el valor de ProgressBar cuando finalice, pero ProgressBar no se actualiza mientras finalizan todas las tareas. Me gustaría incrementar el valor después de finalizar cada tarea. ¿Podrías ayudarme a resolver el problema?
Lo que he probado:
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); }
Solución 1
En lugar de invocar su barra de progreso, use un Interfaz 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]
コメント