C# task.run() không cập nhật thanh tiến trình

lập trình


Tôi có một số tệp csv, chức năng chuyển đổi tệp thành DataTable và tập dữ liệu để thu thập tất cả các bảng. Tôi đã cố gắng chạy tác vụ không đồng bộ cho từng tệp và tăng giá trị của ProgressBar khi hoàn tất, nhưng ProgressBar không cập nhật trong khi tất cả các tác vụ đã hoàn thành. Tôi muốn tăng giá trị sau mỗi nhiệm vụ hoàn thành. Bạn có thể vui lòng giúp tôi giải quyết vấn đề?

Những gì tôi đã thử:

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

Giải pháp 1

Thay vì gọi thanh Tiến trình của bạn, hãy sử dụng Giao diện IProgress (Hệ thống) | Microsoft Tìm hiểu[^] để báo cáo tiến trình tới luồng GUI thông qua một sự kiện:

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