שאלה בC#: איך להריץ סקריפט שלא יתקע את התוכנה (windows form).
-
pcinfogmachכתב ב9 באוק׳ 2023, 1:27 נערך לאחרונה על ידי pcinfogmach 10 בספט׳ 2023, 1:28
כאשר מריצים סקריפט מתוך form מכיון שהסקריפט משתמש עם אותו thread של ה-form אז הוא בעצם תוקע את התוכנה.
הפתרון הוא כמובן להריץ אותו על thread אחר.מה שהסתבכתי הוא מה לעשות כאשר אני צריך שהform לא ייתקע אבל בו זמנית הסקריפט יהיה לו אינטראקציה עם הform כמו למשל progressbar שנמצא בתוך ה form
-
בWinforms נהוג להשתמש בBackgroundWorker שמיועד בדיוק עבור זה.
בWPF משתמשים בטריד רגיל ומשתמשים במנגנון שליחת הודעות של WPF. -
@dovid
תודה.
אם הבנתי נכון אז backgroundworker עוזר רק כאשר מריצים סקריפט מתוך winform
מה עושים כאשר המקרה הוא הפוך כשמריצים winform מתוך סקריפט -
@pcinfogmach המינוח סקריפט לא הכי מתאים פה, זה קוד.
כל טופס של winforms מופיע מתוך קוד (לעיתים מאחורי הקלעים)
והפקד האמור מתאים בכל מקרה. -
לדעתי הדרך הכי טובה זה להשתמש בשיטה האסינכרונית
לדוגמה
//פונקציה אסינכרונית private async Task DoSomething() { label1.Text = "Before await";// זה ירוץ על ה UI Thread await Task.Run(() => { // פה תכניס את הקוד הכבד שלך // זה ירוץ על Thread אחר }); label1.Text = "After await";// זה ירוץ על ה UI Thread } בזמן שירוץ הTask ה-UIThread יהיה משוחרר
תאסוף את הנתונים בתוך הTask ותכניס את זה לפקדים אחרי הTask כשתחזור ל-UIThreadנ.ב. יש גם אפשרות לגשת ל-UIThread מתוך ה-Task או כל Thread אחר האינטרנט מלא בדוגמאות
-
@Mordechai-0 תשובה מצויינת לאיך לעדכן אחרי, אבל השאלה עסקה בתוך כדי ועל זה נידבת בנ.ב. לכתוב שיש דוגמאות באינטרנט...
אם עושים בלי BackgroundWorker אז הדרך היא ככה:
progressBar1.Invoke(new Action(() => progressBar1.Value = 52));
1/6