C# task.run() tidak memperbarui bilah kemajuan

pemrograman


Saya memiliki beberapa file csv, fungsi yang mengonversi file ke DataTable dan kumpulan data untuk mengumpulkan semua tabel. Saya telah mencoba menjalankan tugas secara asinkron untuk setiap file dan meningkatkan nilai ProgressBar setelah selesai, tetapi progresBar tidak diperbarui saat semua tugas selesai. Saya ingin menambah nilainya setelah setiap tugas selesai. Bisakah Anda membantu saya menyelesaikan masalah ini?

Apa yang saya coba:

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

Solusi 1

Daripada Memanggil bilah Kemajuan Anda, gunakan IProgress Antarmuka (Sistem) | Microsoft Belajar[^] untuk melaporkan kemajuan ke thread GUI melalui suatu acara:

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