Sunday, May 09, 2010

Ways to work on the main thread 1

שמתי לב שאני מאוד אוהבת להשוות דברים ... למשל כשאני פוגשת 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

Posted via email from jasper22's posterous