none
שאלה לגבי הבדל בין הרצת Events ב-runtime כנגד design time RRS feed

  • שאלה

  • יש לי שאלה כללית לגבי משמעות ביצועים של הרצת אירועים ב-designTime vs RunTime.

    יש לי טופס כלשהו ב-winform אשר מכיל כל מיני קונטרולי הזנת מידע (combobox, text box, numupdown וכו')

    כאשר לוחצים על שמירה הנתונים נכנסים בעזרת שגרת Insert  או UPDATE ל-SQL SERVER.

    השאלה שלי היא כזאת, לפני ביצוע השמירה אני רוצה לוודא שהמשתמש אכן שינה משהו בטופס (במידה והוא פותח רשומה קיימת) ולא לשלוח את הרשומה סתם לעדכון

    ב-DB במידה ולא בוצעו שינויים. לצורך כך אני מחזיק דגל בוליאני שכל ה"ארועי שינוי מידע" של הקונטולים מדליקים אותו (אירועים כגון valuechanged, textchanged וכו').

    שמתי לב שכאשר אני מפעיל את האירועים ב-designtime גם בזמן טעינת הרשומה האירועים מזהים שינוי ערך בקונטרול וישר "מדליקים" את הדגל.

    כמובן שלא בעיה לתת לזה טיפול אך אני תוהה האם לא יעיל יותר להירשם לאירועים ב-runtime לאחר טעינת הרשומה וכך למנוע הפעלה מיותרת של ה-events.

    לפי הגיון מבחינת ביצועים זה עדיף אך האם יש משמעויות נוספות לכך שאני מבצע אותם ב-runtime? 

    תודה

    אופיר

    יום שישי 15 יוני 2012 11:06

תשובות

  • מתנצל, לא שמתי לב שדובר על winforms (קראתי מהר).

    לא אמורה להיות בעיה עם רישום event-ים רק לאחר הטעינה מה-DB, אך יש להזהר שכן הרצת רישום event-ים שמבוצעת בזמן ריצה ולא ב-ctor יכולה לגרום בטעות לרישום כפול ל-event-ים, ולכן מומלץ לזכור להסיר את הרישום ל-event לפני ההרשמה מחדש (הסרת רישום לא תקרוס אם לא בוצע רישום, אך תמנע רישום כפול).

    אופציה אחרת שניתן לעשות היא ע"י הוספה של עוד משתנה בוליאני IsLoading שמציין שאתה כרגע בזמן טעינה של נתונים. את הדגל מדליקים לפני ביצוע הטעינה ומאפסים לאחר סיום הטעינה. אם כתוצאה מהטעינה והשמת הערכים קופץ event, אז ב-event בודקים אם הפעולה היא בגלל IsLoading. זה שמיש במיוחד בסביבות ובפקדים שמקפיצים event-ים תוך כדי שינוי ה-data source שלהם, אבל פחות רלוונטי לפקדים שמבצעים פעולות אלו רק בזמן rendering/binding/idle (היינו, לאחר סיום הרצת הקוד).

    אגב - רק חידוד קטן - אין הבדל בין רישום ל-event ב-runtime לעומת designtime - גם כשאתה בזמן design ואתה ממפה event למתודה, למעשה אתה יוצר שורת רישום ל-event שנוצרת ב-generated code של ה-form, אז בסופו של דבר זו אותה שורת קוד שפשוט המיקום הרצה שלה משתנה (מ-ctor לאיזשהי מתודה פנימית). מבחינת ביצועים זה זניח לחלוטין.


    Please mark posts as answers/helpful if it answers your question.
    Senior Consultant on WCF, ASP.NET, Siverlight, and Entity Framework. Author of Microsoft's Official WCF 4 Course. Co-author of the Microsoft HPC/Azure burst whitepaper.
    Visit my blog: http://blogs.microsoft.co.il/blogs/idof

    • סומן כתשובה על-ידי ofir_bl שבת 16 יוני 2012 09:33
    שבת 16 יוני 2012 09:21
    מנחה דיון

כל התגובות

  • לרוב לא אמור להיות הבדל אם אתה נרשם לאירועים לפני או אחרי טעינת ערכים לפקד הזנת מידע, אך כמובן התשובה שלי בערבון מוגבל מאחר ולא פירטת באיזה פקד מדובר ובאיזה סביבה מדובר (wpf, winforms...).

    אבל מנגד, הייתי בכלל מסתכל על הנקודה בה אתה טוען נתונים לפקד - בזמן design זה מיותר להפעיל קוד שהולך ל-DB, זה סתם יעיק על זמן הפיתוח שלך. במידה ואתה צריך נתוני דמה, עדיף לכתוב איזשהי מתודה צדדית שיודעת ליצר מידע פיקטיבי ובקוד להתנות את הרצת המתודה הזו או את הגישה ל-DB באם אתה בזמן design או runtime.


    Please mark posts as answers/helpful if it answers your question.
    Senior Consultant on WCF, ASP.NET, Siverlight, and Entity Framework. Author of Microsoft's Official WCF 4 Course. Co-author of the Microsoft HPC/Azure burst whitepaper.
    Visit my blog: http://blogs.microsoft.co.il/blogs/idof

    שבת 16 יוני 2012 09:02
    מנחה דיון
  • שלום עידו,

    ציינתי בפוסט הקודם שהטופס הנתון הוא ב-winform.

    אני לא הולך ל-DB ב-DESIGN TIME אלה נרשם שם ל-EVENT מסוים (למשל TEXTCHANGED עבור פקד TEXT BOX) שכל תפקידו הוא

    לשנות ערך של משתנה בוליאני במקרה שבאמת המשתמש עורך שינוי בערך שנמצא ב-TEXT BOX. 

    הטעינה של הרשומות מה-DB נעשית ב-RUNTIME. כאשר משתמש פותח באמצעות האפליקציה רשומה קיימת (הרשומות מוצגות בגריד), אני טוען את כל ערכיה ל-FORM מסוים והוא מציג את תוכן הרשומה

    בפקדים שונים. במידה והמשתמש לא שינה שום ערך בשום פקד היושב ב-FORM איני רוצה לשמור את הנתונים אלה רק כאשר בוצע שינוי. כאשר נרשמים ל-EVENTS ב-DESIGN TIME האירועים "קופצים"

    גם בזמן טעינת הרשומה הקיימת לטופס וזו סתם עבודה מיותרת מאחר ומבחינתי, שינוי הוא רלוונטי רק לאחר שהרשומה נטענה והמשתמש ביצע שינוי כלשהו. 

    הפתרון לכך הוא ברור לי  והוא רישום לכל ה-EVENTS שבוחנים האם בוצע שינוי כלשהו בזמן ה-RUNTIME לאחר שהרשומה כבר נטענה ולא ב-DESIGN TIME.

    שאלתי כאן היא יותר כללית ולא יישומית - בכוונה נתתי דוגמה מאוד פשוטה.

    מה שאני מנסה לברר הוא האם יש משמעויות נוספות להירשמות ל-EVENTS ב-RUNTIME לעומת DESIGN TIME? משמעות ביצועית כלשהי או כל דבר אחר?

    שוב תודה,

    אופיר

    שבת 16 יוני 2012 09:12
  • מתנצל, לא שמתי לב שדובר על winforms (קראתי מהר).

    לא אמורה להיות בעיה עם רישום event-ים רק לאחר הטעינה מה-DB, אך יש להזהר שכן הרצת רישום event-ים שמבוצעת בזמן ריצה ולא ב-ctor יכולה לגרום בטעות לרישום כפול ל-event-ים, ולכן מומלץ לזכור להסיר את הרישום ל-event לפני ההרשמה מחדש (הסרת רישום לא תקרוס אם לא בוצע רישום, אך תמנע רישום כפול).

    אופציה אחרת שניתן לעשות היא ע"י הוספה של עוד משתנה בוליאני IsLoading שמציין שאתה כרגע בזמן טעינה של נתונים. את הדגל מדליקים לפני ביצוע הטעינה ומאפסים לאחר סיום הטעינה. אם כתוצאה מהטעינה והשמת הערכים קופץ event, אז ב-event בודקים אם הפעולה היא בגלל IsLoading. זה שמיש במיוחד בסביבות ובפקדים שמקפיצים event-ים תוך כדי שינוי ה-data source שלהם, אבל פחות רלוונטי לפקדים שמבצעים פעולות אלו רק בזמן rendering/binding/idle (היינו, לאחר סיום הרצת הקוד).

    אגב - רק חידוד קטן - אין הבדל בין רישום ל-event ב-runtime לעומת designtime - גם כשאתה בזמן design ואתה ממפה event למתודה, למעשה אתה יוצר שורת רישום ל-event שנוצרת ב-generated code של ה-form, אז בסופו של דבר זו אותה שורת קוד שפשוט המיקום הרצה שלה משתנה (מ-ctor לאיזשהי מתודה פנימית). מבחינת ביצועים זה זניח לחלוטין.


    Please mark posts as answers/helpful if it answers your question.
    Senior Consultant on WCF, ASP.NET, Siverlight, and Entity Framework. Author of Microsoft's Official WCF 4 Course. Co-author of the Microsoft HPC/Azure burst whitepaper.
    Visit my blog: http://blogs.microsoft.co.il/blogs/idof

    • סומן כתשובה על-ידי ofir_bl שבת 16 יוני 2012 09:33
    שבת 16 יוני 2012 09:21
    מנחה דיון
  • זה בדיוק מה שעשיתי - הסרת רישום ה-event לפי ההרשמה מחדש.

    קיבלתי תשובה בדיוק למה שרציתי לדעת אך תו"כ תשובתך עלתה לי שאלה נוספת.

    האם יש משמעות לרישום כפול ל-event? זה לא רק מצב של (רשום \ לא רשום)?

    שבת 16 יוני 2012 09:35
  • זה תלוי איך אתה מקשר את המתודה ל-event ואם אתה משתמש עם מתודות או anonymous methods. בגדול יכול להיווצר מצב שאותו קוד יורץ כמה פעמים.

    אתה מוזמן לנסות לבצע הרשמה כפולה אצלך בקוד ולראות מה קורה.


    Please mark posts as answers/helpful if it answers your question.
    Senior Consultant on WCF, ASP.NET, Siverlight, and Entity Framework. Author of Microsoft's Official WCF 4 Course. Co-author of the Microsoft HPC/Azure burst whitepaper.
    Visit my blog: http://blogs.microsoft.co.il/blogs/idof

    שבת 16 יוני 2012 09:40
    מנחה דיון