لا يقوم C# Task.run() بتحديث شريط التقدم

برمجة


لدي العديد من ملفات CSV، وظيفة تحويل الملف إلى DataTable ومجموعة البيانات لجمع كل الجداول. لقد حاولت تشغيل المهمة بشكل غير متزامن لكل ملف ولزيادة قيمة ProgressBar عند الانتهاء، لكن شريط التقدم لا يتم تحديثه أثناء انتهاء جميع المهام. أرغب في زيادة القيمة بعد انتهاء كل مهمة. هل يمكنك مساعدتي في حل المشكلة؟

ما حاولت:

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

الحل 1

بدلاً من استدعاء شريط التقدم، استخدم واجهة IProgress (النظام) | مايكروسوفت تعلم[^] للإبلاغ عن التقدم إلى مؤشر ترابط واجهة المستخدم الرسومية عبر حدث:

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