ProgressBar בWPF תוך כדי פעולת thread
-
private async void search(string[] files) { progressBar.Maximum = files.Length; List<System.Threading.Tasks.Task> searchTasks = new List<System.Threading.Tasks.Task>(); foreach (string file in files) { searchTasks.Add(Task.Run(() => { this.Dispatcher.Invoke(() => { progressBar.Value = progressBar.Value + 1; File.ReadAllLines(file); }); })); } await System.Threading.Tasks.Task.WhenAll(searchTasks); progressBar.Value = 0; }
-
-
@dovid
לא הבנתי כלום. אני מודה באשמה הניסיון שלי בbinding היה ניסוי וטעיה (אני עוד לא מבין את המושג מספיק). אבל הקוד של ה-Invoke לא נתפס אצלי כניסוי וטעיה - אולי הוא טעות אבל לא ניסוי וטעיה.הנה איך שאני מבין את הקוד - תסביר לי היכן אני טועה או פשוט לא מבין כלום:
- הקוד יוצר רשימה של משימות
- הוא מבצע אותם בצורה של threading
- כל משימה מכילה בתוכ פקודה של עדכון ה-progressbar (שזה לא קורה!)
- לאחר סיום כל המשימות ה-progressbar מאופס כדי שיהי מוכן לחיפוש הבא.
נ.ב. גם אשמח אם תסביר לי למה בwinforms בדיוק אותו הדבר עובד מצויין. (רק ששם אני יכול להשתמש עם invoke בלי dispatcher).
-
@dovid כתב בProgressBar בWPF תוך כדי פעולת thread:
ספציפית לבעיה הזאת מן הסתם גוגל על task dispatcher progressbar יעזור לך,
אני לא עצלן כבר עשיתי את גוגל לפני שפתחתי פוסט. הבעיה נפוצה הפתרונות... או שלא לא מבין אותם או שהם ממש לא קשורים.
אשמח מאוד אם מישהו ירחם עלי ויסביר לי מה הפתרון.
-
@pcinfogmach כתב בProgressBar בWPF תוך כדי פעולת thread:
private async void search(string[] files) { progressBar.Maximum = files.Length; List<System.Threading.Tasks.Task> searchTasks = new List<System.Threading.Tasks.Task>(); foreach (string file in files) { searchTasks.Add(Task.Run(() => { this.Dispatcher.Invoke(() => { progressBar.Value = progressBar.Value + 1; File.ReadAllLines(file); }); })); } await System.Threading.Tasks.Task.WhenAll(searchTasks); progressBar.Value = 0; }
למה
File.ReadAllLines(file)
נמצא בתוך הקריאה לDispatcher.Invoke
? תנסה להוציא אותו מחוץ ל Dispatcher, הקריאה אמורה להכיל קוד שמשנה את התצוגה בלבד. הגיוני שהתרד של התצוגה נתקע כי את מריץ עליו עוד לוגיקה שלא קשורה ל UI שיתכן שגוזלת זמן, ובגלל שה UI לא מגיב אתה לא רואה את ההתקדמות. (חוץ מזה שצריך לאפס אתprogressBar.Value
לאפס, מה ש @dovid כתב לך)