הערה
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות להיכנס או לשנות מדריכי כתובות.
הגישה לדף זה מחייבת הרשאה. באפשרותך לנסות לשנות מדריכי כתובות.
Unified Service Desk הוא יישום מבוסס Windows Presentation Foundation (WPF) שבו כל הפעולות ב- Unified Service Desk מבוצעות בהליך המשנה הראשי של WPF Dispatcher . המחלקה WPF Dispatcher מספקת שירותים לניהול תור פריטי העבודה עבור תהליכון.
באפשרותך להרחיב את Unified Service Desk על-ידי יצירת פקדים מותאמים אישית ואירוח שלו בתוך Unified Service Desk. עם זאת, אם פקד מתארח מותאם אישית מכיל קוד פגום או מבצע פעולות באמצעות הליכי משנה חדשים מבלי לטפל כראוי בחריגים במהלך ביצוע הקוד, הוא עלול לגרום לבעיות יציבות ב- Unified Service Desk, ואף עלול לגרום ליישום הלקוח לקפוא או להפסיק להגיב. החריגים הלא מטופלים בפקדים מותאמים אישית של ספקים חיצוניים מקשים על זיהוי, פתרון בעיות ופתרון הבעיה על-ידי צוות המוצר/התמיכה מכיוון שייתכן שלא תהיה להם גישה למידע מדוע התרחשה שגיאה/חריגה ב- Unified Service Desk, ולקוד המדויק שגרם לשגיאה.
היכרות עם SafeDispatcher המספק מנגנון רב עוצמה ואינפורמטיבי לטיפול בחריגים עבור פקדים מתארחים מותאמים אישית ב- Unified Service Desk על-ידי מתן רישום מוכן לשימוש עבור חריגים שלא טופלו עם מידע מפורט על המקור והגורם לחריגה, ומתן אפשרות לקבוע את התצורה או להחליף את הטיפול בחריגות של SafeDispatcher כדי לבצע כמה שלבים אחרים. פעולה זו גם מונעת מלקוח Unified Service Desk להפסיק להגיב עקב חריגים שלא טופלו בקוד הבקרה המתארח המותאם אישית.
מהו SafeDispatcher?
SafeDispatcher בנוי על אותם קווים כמו WPF Dispatcher, ומספק טיפול גמיש ואינפורמטיבי בחריגים עבור פקדים מתארחים מותאמים אישית בתוך Unified Service Desk. הוא נחשף כמאפיין מוגן, SafeDispatcher, במחלקה DynamicsBaseHostedControl , מה שהופך את SafeDispatcher לזמין באופן אוטומטי עבור כל הפקדים המתארחים המותאמים אישית של Unified Service Desk הנגזרים מהמחלקה DynamicsBaseHostedControl .
הערה
אל תשתמש במחלקה SafeDispatcher בקוד שלך כדי לעבוד עם SafeDispatcher. במקום זאת, עליך להשתמש במאפיין SafeDispatcher במופע הפקד המתארח המותאם אישית שלך שנגזר מהמחלקה DynamicsBaseHostedControl כדי להשתמש ב- SafeDispatcher.
בדיוק כמו WPF Dispatcher, SafeDispatcher מספק שיטות כגון BeginInvoke, Invokeו-InvokeAsync להפעלת פעולות באופן סינכרוני או אסינכרוני ב-SafeDispatcher עם פרמטר בוליאני נוסף, runOnMainUiThread
הקובע אם להפעיל את SafeDispatcher בשרשור ממשק משתמש או לא.
SafeDispatcher מספק את היתרונות הבאים:
הליך משנה של משגר ממשק משתמש מוגן: מפתחים יכולים להפעיל את כל הפעולות התלויות בממשק המשתמש ב-SafeDispatcher על-ידי הגדרת הפרמטר
runOnMainUiThread
ל-"true" בפעולת השירות invoke כדי להפעיל את SafeDispatcher בהליך משנה של ממשק המשתמש. כל חריגה לא מטופלת שהועלתה במשגר ממשק המשתמש הראשי מטופלת באופן בטוח ברמת בקרת התארחות, ולא מועברת למטפל האירועים הכללי DispatcherUnhandledException.שרשור מוגן שאינו משגר ממשק משתמש: מפתחים יכולים להריץ את כל הקוד שאינו תלוי בממשק המשתמש ב-SafeDispatcher. על-ידי הגדרת הפרמטר
runOnMainUiThread
ל- "false" בפעולת השירות Invoke כדי להפעיל את SafeDispatcher בהליך משנה שאינו ממשק משתמש. כל חריגה לא מטופלת שהועלתה במשגר הראשי שאינו ממשק משתמש, מטופלת בבטחה ברמת הבקרה המתארחת במקום לבעבע למטפל האירועים הכללי DispatcherUnhandledException.מידע מפורט אודות מקור חריגה וסיבה:: המטפל בחריגות של SafeDispatcher מועלה כאשר חריגה לא מטופלת מועלית ברמת DynamicsBaseHostedControl על-ידי ממשק המשתמש או הליך משנה שאינו ממשק משתמש, המאפשר ל- Unified Service Desk ללכוד מידע קריטי ברמת הפקד המתארח, כגון שם פקד מתארח, סוג פקד מתארח, שם שיטה ומעקב מלא אחר מחסנית כדי לזהות את המיקום המדויק ואת הסיבה לחריגה.
קביעת תצורה או עקיפה של המטפל בחריגות של SafeDispatcher: מפתחים יכולים להשתמש באופן הפעולה המוכן לשימוש של המטפל בחריגות של SafeDispatcher כדי לבקש מהמשתמש מידע על החריגה שלא טופלה או לעקוף את אופן הפעולה בהתאם לדרישה העסקית שלו, כגון קביעת תצורה של רישום נוסף, סגירת פקדים מבוססי הפעלה או יציאה מלקוח Unified Service Desk.
כיצד להשתמש ב-SafeDispatcher?
המאפיין SafeDispatcher זמין עבור כל מופעי הבקרה המתארחים המותאמים אישית של Unified Service Desk הנגזרים מהמחלקה DynamicsBaseHostedControl . מופע SafeDispatcher זמין להפעלה על תת-ההליך של ממשק המשתמש בעת אתחול הפקד המתארח המותאם אישית. עם זאת, מופע SafeDispatcher יהיה זמין להפעלה רק בהליך משנה שאינו ממשק משתמש כאשר תבצע את פעולת השירות invoke בפעם הראשונה.
הפעלה סינכרונית של פונקציה ספציפית לממשק המשתמש באמצעות SafeDispatcher
SafeDispatcher.Invoke(() => { ProcessData(); }, DispatcherPriority.Normal, CancellationToken.None, true);
או
SafeDispatcher.Invoke(() => { ProcessData(); }, DispatcherPriority.Normal, CancellationToken.None);
הערה
עבור פונקציה ספציפית לממשק משתמש, עליך להגדיר את הפרמטר האופציונלי
runOnMainUiThread
ל- "true". אם לא תציין ערך לפרמטר זה, כברירת מחדל "true" מועבר. לכן, כל אחת מהגדרות השיטה לעיל עובדת מצוין.הפעל באופן אסינכרוני פונקציה ספציפית לממשק המשתמש באמצעות SafeDispatcher. אתה יכול להשתמש בשיטת
BeginInvoke
אוInvokeAsync
.SafeDispatcher.BeginInvoke(new Action(() => { ProcessData(); }));
או
SafeDispatcher.InvokeAsync(new Action(() => { ProcessData(); }));
התאמה אישית של המטפל בחריגות של SafeDispatcher
עם הצגת SafeDispatcher, כל החריגים שלא טופלו ב- Unified Service Desk יעלו את האירוע SafeDispatcherUnhandledException במקום את האירוע הכללי DispatcherUnhandledException. פעולת השירות SafeDispatcherUnhandledExceptionHandler מספקת מטפל בחריגות מוכן לשימוש עבור SafeDispatcher כדי להציג מידע למשתמש Unified Service Desk עם הפרטים הבאים: בקרת מקור שבה התרחשה החריגה ומידע מפורט על החריגה.
אפשר גם לעקוף את הטיפול בחריגות המוכנות לשימוש עבור SafeDispatcher כדי לבצע פעולה אחרת, כגון הנחיה למשתמש לסגור פקד מתארח לא דינאמי המבוסס על הפעלה.
הקוד לדוגמה הבא מדגים כיצד ניתן לעקוף את המטפל בחריגות של SafeDispatcher המוכן לשימוש כדי להציג תיבת הודעה כדי לבקש מהמשתמש לסגור את הפקד המתארח המותאם אישית כאשר מתרחשת חריגה:
protected override void SafeDispatcherUnhandledExceptionHandler(object sender, SafeDispatcherUnhandledExceptionEventArgs ex)
{
string error = String.Format(CultureInfo.InvariantCulture,
"Error in hosted control Application:{0} - Exception : {1} \r\nInnerException\r\n {2}", this.ApplicationName, ex.Exception, ex.InnerException);
DynamicsLogger.Logger.Log(error, TraceEventType.Error);
if (MessageBox.Show("Exception occurred in hosted control - " + this.ApplicationName + ".Do you wish to close it ?", "Question", MessageBoxButton.YesNo,
MessageBoxImage.Warning) == MessageBoxResult.Yes)
{
SafeDispatcher.BeginInvoke(() => { this.desktopAccess.CloseDynamicApplication(this.ApplicationName); });
}
}
מעבר מ-WPF Dispatcher ל-SafeDispatcher בפקדים מתארחים מותאמים אישית קיימים
מכיוון שהחוזה בין WPF Dispatcher ל-SafeDispatcher כמעט זהה, המאמץ לעבור מ-WPF Dispatcher ל-SafeDispatcher הוא מינימלי. כדי להעביר מופע פקד מתארח כלשהו הנגזר מהמחלקה DynamicsBaseHostedControl , החלף את כל מופעי "Dispatcher" ב- "SafeDispatcher".
לדוגמה, שקול את הקוד הבא:
Dispatcher.Invoke((System.Action)delegate()
{
DynamicsLogger.Logger.Log("Raising SetupHotKey's", TraceEventType.Verbose);
SetupHotkeys();
CRMGlobalManager.AppWithFocusChanged += CRMGlobalManager_AppWithFocusChanged;
FireEvent("DesktopReady");
InitializeFocusSelection();
});
החלף Dispatcher
את הקוד לעיל ב SafeDispatcher
- ; שאר הקוד נשאר זהה:
SafeDispatcher.Invoke((System.Action)delegate()
{
DynamicsLogger.Logger.Log("Raising SetupHotKey's", TraceEventType.Verbose);
SetupHotkeys();
CRMGlobalManager.AppWithFocusChanged += CRMGlobalManager_AppWithFocusChanged;
FireEvent("DesktopReady");
InitializeFocusSelection();
});
דברים שיש לקחת בחשבון בעת השימוש ב-SafeDispatcher
SafeDispatcher מציע מודל מרובה הליכי משנה המועיל ביותר בשיגור פונקציות באופן סינכרוני או אסינכרוני להליכי משנה של ממשק משתמש או שאינם ממשק משתמש. פעולות שצריכות להתבצע על הליכי משנה זמינים עם עמידות בפני תקלות אמורות להתבצע ב-SafeDispatcher. עם זאת, יש ליישם ריבוי הברגה בזהירות רבה כדי למנוע מבוי סתום בין חוטים. דוגמה אחת כזו היא שיגור משרשור שאינו ממשק משתמש למשגר WPF הראשי באופן סינכרוני. בואו ניקח בחשבון את הדוגמה הבאה:
Thread thread = new Thread(() =>
{
Dispatcher.Invoke(ProcessData);
});
thread.SetApartmentState(ApartmentState.STA);
thread.Priority = ThreadPriority.Highest;
thread.IsBackground = true;
thread.Start();
thread.Join();
השיטה thread.Join()
גורמת לכך שהחוט הראשי נחסם וממתין לסיום החוט STA (דירה בעלת חוט אחד), אך חוט ה-STA ממתין שהחוט הראשי יסיים את הביצוע של ProcessData
. פעולה זו גורמת לאפליקציה שלך למצב מבוי סתום.
באופן דומה, שקול את הדוגמה הבאה:
// Invoke on STA thread
SafeDispatcher.Invoke(() =>
{
// Invoke back on main dispatcher
SafeDispatcher.Invoke(() =>
{
ProcessData();
});
}, false);
פעולת השירות SafeDispatcherUnhandledExceptionHandler נקראת אם מתרחשת חריגה ב-WPF Dispatcher או בהליך המשנה של STA שאינו ממשק משתמש והיא מועלית בהליך המשנה המתאים שבו התרחשה החריגה. עליך להיזהר ולוודא שאינך ממקם את השילוב לעיל במטפל זה, כלומר, אם החריגה התרחשה בהליך משנה שאינו של ממשק המשתמש, אל תשלח באופן סינכרוני למשגר ממשק המשתמש הראשי.
protected override void SafeDispatcherUnhandledExceptionHandler(object sender, SafeDispatcherUnhandledExceptionEventArgs ex)
{
Dispatcher.Invoke(LogException); // Incorrect
SafeDispatcher.Invoke(LogException); // Incorrect
SafeDispatcher.BeginInvoke(LogException); // Correct
SafeDispatcher.InvokeAsync(LogException); // Correct
}
למידע נוסף
יצירת בקרה מתארחת מותאמת אישית של Unified Service Deskהרחבת Unified Service Deskקביעת תצורה של רישום אבחון לקוח ב- Unified Service Desk