C# task.run() ne met pas à jour la barre de progression

la programmation


J’ai plusieurs fichiers CSV, une fonction qui convertit le fichier en DataTable et un ensemble de données pour collecter toutes les tables. J’ai essayé d’exécuter la tâche de manière asynchrone pour chaque fichier et d’incrémenter la valeur de ProgressBar une fois terminé, mais progressBar ne se met pas à jour lorsque toutes les tâches sont terminées. Je voudrais augmenter la valeur après chaque tâche terminée. Pourriez-vous s’il vous plaît m’aider à résoudre le problème ?

Ce que j’ai essayé :

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);
}

Solution 1

Au lieu d’appeler votre barre de progression, utilisez un Interface IProgress (Système) | Microsoft Apprendre[^] pour signaler la progression au thread GUI via un événement :

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