שמתי לב שאני מאוד אוהבת להשוות דברים ... למשל כשאני פוגשת 2 פתרונות דומים לאותה בעיה - עניין היעילות ואופן השימוש בכל אחד מהם, מה החסרונות בכל מקרה מעניינים אותי מאוד.
הפעם נלך על Invoke on Main Thread הכוונה שלי לדבר בעצם על עבודה עם UI וכוון ש UI בדרך כלל נוצר ב Main thread אז עליו נתמקד. אני מכירה כמה פתרונות ונדון עליהם כאן:
הפתרון היותר מוכר :
if (InvokeRequired)
{
Invoke(new MethodInvoker(MethodName));
}
else
{
MethodName();
}
מה שקורה כאן זה בעצם שאלה : האם מה שרוצים להפעיל שקשור ב UI מופעל מה Thread שבו נוצר ה UI ?
אם לא מאותו אחד – אז משתמשים ב MethodInvoker שהוא delegate מובנה שמצביע לפונקציה void ללא פרמטרים.
שאלתם את עצמיכם איך זה עובד מפה ? חוץ מזה שניתן לקרוא כי Invoke מחפש את ה handler של form במעלה היררכיית ה controls עד שמוצא אחד ( ואם לא מוצא מחזיר false)
הרישום נרשם בתור לMessage Loop ומבוצע בפועל כאשר מגיעה זמנו.
מה שחשוב להוסיף הוא בעצם שכל המטרה כאן היא למנוע ( בדרך כלל ) קריסה של המערכת... למה אתם שואלים ? אז ככה... כשעובדים עם UI בעצם בסופו של דבר ה System.Windows.Forms ניגש לפונקציות מתוך Win32 API – זה דיי ברור. העניין הוא שAPI זה נכתב בסביבה (Apatrment) שיועדה לעבוד עם Thread אחד ויחיד. מה שאנחנו מנסים למנוע הוא לעבוד בסביבה זו ב multy threading .
לכן אנחנו חייבים להגביל את הגישה ל UI באופן זה.
Read more: GalinaK