C# task.run() no actualiza la barra de progreso

programación


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 (Sistema) | Microsoft aprende[^] para informar el progreso al hilo de la GUI a través de un evento:

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をコピーしました