locked
בעיה בהרצת אפליקציית סילברלייט במקביל RRS feed

  • שאלה

  • יש לי אפליקציית סילברלייט, שמעלה את נתוני התצוגה של הפקדים מהDB. (גודל,פונט,רקע,וכד').

    כאשר מריצים את האפליקציה במקביל נראה שהיא משתבשת; לעתים מופיעות הודעות שגיאה שלא מופיעות בהרצה רגילה (כגון ה key לא נמצא ב dictionary) ולעתים פשוט נתונים מסוימים לא נטענים וזה משפיע כמובן על מראה הפקדים.

    השאלות שלי:

    1. האם יש למישהו רעיון לפיתרון, או אפילו רעיון להסבר התופעה?

     2. איך אני יכולה להריץ מ Visual Studio במקביל? [ואולי כך להתחקות אחר שורשי הבעיה]

    תודה רבה! :)

    יום ראשון 02 ספטמבר 2012 17:57

כל התגובות

  • היי רותם,

    מה הכוונה "מריצים אפליקציה במקביל"? במקביל למה?

    יום שלישי 04 ספטמבר 2012 11:46
  • כלומר,מריצים מספר מופעים של האפליקציה.

    [האפליקציה מתארחת בדף באתר,אז פותחים אותו במס' טאבים\דפדפנים\מחשבים]

    האפליקציה שולפת את הנתונים מקובץ mdb ע"י Web Service.

    יום שלישי 04 ספטמבר 2012 11:48
  • רק ניחוש - כל קריאה שמגיעה לשרת דרך סרביס היא מגיע באותו טרד (או שזה מסונכרן בצורה שבכל רגע רק אחד מקבל גישה). כאשר אפליקציית סילברלייט שלך עולה, היא מבצעת קריאה אסינכרונית לסרביס בשביל לקבל נתונים - ובנתיים ממשיכה לעלות. אם מריצים מספר אפליקציות בו זמנית (ובשרת רק אחת מקבלת תשובה בכל רגע נתון) - אז יש מצב שאיזשהי מהאפליקציות תסיים טעינה של UI, ורק בהמשך היא תקבל תשובה משרת.

    אם כל מה שאני תארתי זה נכון, אז את יכולה לעשות מספר דברים בנידון:

    * לא להמשיך לעלות, עד שלא מקבלים תשובה משרת. אפשר בנתיים להציג אנימציה נחמדה

    * לעלות, וכאשר מקבלים תשובה לדעת להתעדכן. DynamicResource יכול להיות פתרון. אם לא, אז לקמבן עם Binding

    * בלי קשר, לראות האם אפשר למקבל דברים בשרת - אחרת זה לא סקלאבילי

    יום שלישי 04 ספטמבר 2012 14:52
  • תודה רבה על תשובתך! זה בהחלט נשמע לי הכיוון.

    כיוון שמדובר בקוד שלא כתבתי (אני רק מתחזקת אותו), פניתי למי שכתב אותו והצגתי את מה שאתה אומר. הוא טוען שקיימת השהייה של העלאת ה UI עד שלא מתקבלת תשובה מהשרת, כך:

    Loader.DBFinished += new Loader.customEvent(Loader_DBFinished);
    Loader.CallDB("*", " Tbl_Tests where TestCode = '" + TestCode + "'");
    
    
    th = new Thread(new ThreadStart(RunCheckOfStatus));
    th.Start();
    
    
    thBuild = new Thread(new ThreadStart(BuildLevelThread));
    thBuild.Start();

    הסבר: 

    הקריאה ל Loader.CallDB פותחת שרשרת של קריאות לטעינת הנתונים מכל הטבלאות. (בסיום טעינה של טבלה אחת, מתחילים לטעון את השניה וכן הלאה)

    RunCheckOfStatus היא הת'רד הראשי שרץ כל הזמן ודואג לעדכוני הUI והנתונים.

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

    בפונק' RunCheckOfStatus בודקים האם המסך הנוכחי נמצא באוסף המסכים לטעינה.

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

    אם יש לך רעיון לאפשרות איך זה קורה, או רעיונות איך להתקדם לקראת פיתרון הבעיה אשמח מאוד מאוד.

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

    תודה רבה!

    יום שני 10 ספטמבר 2012 10:12