, אסינכרוני תכנותופיתוח תקשורת
אפליקציות Windows 8.1ל-
ואפליקציות Windows Phoneל-8
הקורס סילבוס
Threads in WPF
Threads in WPFהפיתרון. נפרד – לתהליך המתמשכת הפעולה את להעביר
חלונאיות – )הבעיה באפליקציות טריוויאלי (.WPFאו WinFormsלא
WPF ( אוWinForms - ה( עבודת כל את לבצע אותנו את UIמחייב שיצר בתהליך רק.UIה-
: הבא הקוד את לכתוב ניסיון
: הבאה לחריגה יגרום
private void btnDoSomething_Click(object sender, RoutedEventArgs e) { Thread thread = new Thread(Paint); thread.Start(); }
“The calling thread must be STA”
: קוד WpfThread02דוגמת
Threads in WPF
היא לחריגה .STA – Single Thread Apartmentהסיבה
STA( – משתמשים אנו בה הטכנולוגיה של מגבלה (,WinFormsאו WPFלא. ההפעלה מערכת של תכתיב אלא
STA? , איתה מתמודדים איך מגבלה זה
הנקרא רכיב .BackgroundWorkerבאמצעותWPF ( או
WinForms
)לבצע אותנו מחייב
- ה עבודת כל את
UI את שיצר בתהליך רק
UIה-
Threads in WPF - BackgroundWorkerBackgroundWorker
השמות במרחב המוגדרת שימושית .System.ComponentModelמחלקה
- ב וארוכות כבדות מטלות העברת מאפשרת .WPFהמחלקה נפרד לתהליך
. , ביטול על או סיום על התהליך התקדמות על לדווח יכולה
. בחריגים לטיפול מובנית יכולת מכילה
רכיבי לעדכן .UIיכולת
: דוגמה קודBackgroundWorkerSample
Threads in WPF - BackgroundWorker - ב משתמשים :BackgroundWorkerכיצד
.1- ב ) או החלון מחלקת של בתכונה מהמחלקה אובייקט (:XAMLהוספת רוצים אם
התכונות 2. " הגדרת : ח דו קבלת ומאפשרים ביטול מאפשרים החלון של בבנאי הבאותהתקדמות:
public partial class MainWindow : Window { BackgroundWorker background_worker = new BackgroundWorker(); …. }
public MainWindow(){ InitializeComponent(); background_worker.WorkerSupportsCancellation = true; background_worker.WorkerReportsProgress = true;}
: דוגמה קודBackgroundWorkerSample
Threads in WPF - BackgroundWorker.3: הבאים האירועים הגדרת
האירוע המתודה DoWorkהגדרת מופעלת כאשר מועלה אשרRunWorkserAsync ,שרוצים האסינכרונית הפעולה את מממש באירוע הטיפול
. ברקע לבצע
האירועReportProgress בהתקדמות הן הממשק את לעדכן שנרצה פעם בכל יופעל. ביניים תוצאות לעדכן מנת על והן התהליך
, השלישי .RunWorkerCompletedהאירוע מבוטל או מסתיים התהליך כאשר מועלהpublic MainWindow(){ InitializeComponent(); background_worker.WorkerSupportsCancellation = true; background_worker.WorkerReportsProgress = true; background_worker.DoWork += background_worker_DoWork; background_worker.ProgressChanged += background_worker_ProgressChanged; background_worker.RunWorkerCompleted += background_worker_RunWorkerCompleted;}
: דוגמה קודBackgroundWorkerSample
Threads in WPF - BackgroundWorker: התהליך הרצת
private void btnDoSomething_Click(object sender, RoutedEventArgs e) { background_worker.RunWorkerAsync(1000); }
לתהליך הנשלח הפרמטר
: דוגמה קודBackgroundWorkerSample
Threads in WPF - BackgroundWorkerהאירוע .DoWorkמימוש ברקע, ירוץ אשר התהליך מימוש
, מטיפוס הוא הפרמטר פרמטר להעביר .Objectניתן
. התהליך ריצת את לעצור מנת על בוטל התהליך האם הביצוע במהלך לבדוק יש
void background_worker_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < (int)e.Argument; i++) { if (background_worker.CancellationPending) { e.Cancel = true; break; } Parameters parameter = Paint(); background_worker.ReportProgress(i / 100, parameter); Thread.Sleep(10); } }
בוטל התהליך האם בדיקה
לאירוע הנשלח הפרמטר
האירוע ProgressהעלאתChanged, התקדמות – אחוז הראשון הפרמטר
. נוסף – מידע השני הפרמטר
Threads in WPF - BackgroundWorkerבאירוע :ProgressChangedהטיפול המשתמש – ממשק עדכון
void background_worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { Parameters parameter = e.UserState as Parameters; Ellipse ellipse = new Ellipse(); ellipse.Width = parameter.Size.Width; ellipse.Height = parameter.Size.Height; ellipse.Fill = new SolidColorBrush(parameter.Color); Canvas.SetTop(ellipse, parameter.Location.Y); Canvas.SetLeft(ellipse, parameter.Location.X); canvas.Children.Add(ellipse); txtInterationCounter.Text = e.ProgressPercentage.ToString() + " %"; }
שנשלח הפרמטר
העיבוד .התקדמות
: דוגמה קודBackgroundWorkerSample
Threads in WPF - BackgroundWorker: התהליך סיום
void background_worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) { MessageBox.Show("BackgroundWorker canceled"); } else { MessageBox.Show("BackgroundWorker ended successfully"); } }
ביטול
העיבוד .סיום
: דוגמה קודBackgroundWorkerSample
Threads in WPF - BackgroundWorker
: דוגמה קודBackgroundWorkerSample
Threads in WPF - BackgroundWorker רכיבי מספר להגדיר .BackgroundWorkerניתן בחלון
כלBackgroundWorker. תהליכים מספר להפעיל יכול
: קוד .BackgroundWorkerSample02דוגמת
תרגולהתרגילים 4תרגיל מדף