שאלה בC#: איך להריץ סקריפט שלא יתקע את התוכנה (windows form).
-
כאשר מריצים סקריפט מתוך form מכיון שהסקריפט משתמש עם אותו thread של ה-form אז הוא בעצם תוקע את התוכנה.
הפתרון הוא כמובן להריץ אותו על thread אחר.מה שהסתבכתי הוא מה לעשות כאשר אני צריך שהform לא ייתקע אבל בו זמנית הסקריפט יהיה לו אינטראקציה עם הform כמו למשל progressbar שנמצא בתוך ה form
-
לדעתי הדרך הכי טובה זה להשתמש בשיטה האסינכרונית
לדוגמה
//פונקציה אסינכרונית 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));