[ad_1]
لدي العديد من ملفات 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(); }
[ad_2]
コメント