Poznámka
Na prístup k tejto stránke sa vyžaduje oprávnenie. Môžete sa skúsiť prihlásiť alebo zmeniť adresáre.
Na prístup k tejto stránke sa vyžaduje oprávnenie. Môžete skúsiť zmeniť adresáre.
Unified Service Desk je aplikácia založená na Windows Presentation Foundation (WPF), kde sa všetky operácie v Unified Service Desk vykonávajú v hlavnom vlákne WPF Dispatcher . Trieda WPF Dispatcher poskytuje služby na správu frontu pracovných položiek pre vlákno.
Unified Service Desk môžete rozšíriť vytvorením vlastných ovládacích prvkov a jeho hosťovaním v rámci Unified Service Desk. Ak však vlastný ovládací prvok na hostiteľskom systéme obsahuje chybný kód alebo vykonáva operácie pomocou nových vlákien bez náležitého spracovania výnimiek počas vykonávania kódu, môže to spôsobiť problémy so stabilitou v Unified Service Desk a môže dokonca spôsobiť zamrznutie klientskej aplikácie alebo prestať reagovať. Neošetrené výnimky vo vlastných ovládacích prvkoch tretích strán sťažujú identifikáciu, riešenie problémov a riešenie problému produktovým tímom alebo tímom podpory, pretože nemusia mať prístup k informáciám o tom, prečo sa vyskytla chyba/výnimka v Unified Service Desk, a k presnému kódu, ktorý chybu spôsobil.
Predstavujeme SafeDispečer , ktorý poskytuje výkonný a informatívny mechanizmus spracovania výnimiek pre vlastné ovládacie prvky na hostiteľskom systéme v Unified Service Desk tým, že poskytuje predpripravené zapisovanie do denníka pre neošetrené výnimky s podrobnými informáciami o zdroji a príčine výnimky a umožňuje vám nakonfigurovať alebo prepísať spracovanie výnimiek SafeDispatcher na vykonanie niektorých ďalších krokov. Tým sa tiež zabráni tomu, aby klient Unified Service Desk prestal reagovať z dôvodu neošetrených výnimiek vo vlastnom kóde ovládacieho prvku na hostiteľskom systéme.
Čo je SafeDispečer?
SafeDispatcher je postavený na rovnakých riadkoch ako WPF Dispatcher a poskytuje odolné a informatívne spracovanie výnimiek pre vlastné ovládacie prvky na hostiteľskom systéme v rámci Unified Service Desk. Je vystavený ako chránená vlastnosť SafeDispatcher v triede DynamicsBaseHostedControl , vďaka čomu je SafeDispatcher automaticky dostupný pre všetky vlastné ovládacie prvky na hostiteľskom systéme Unified Service Desk, ktoré sú odvodené z triedy DynamicsBaseHostedControl .
Poznámka
Nepoužívajte triedu SafeDispatcher vo svojom kóde na prácu so SafeDispečerom. Namiesto toho musíte použiť vlastnosť SafeDispatcher na vlastnej inštancii ovládacieho prvku na hostiteľskom systéme, ktorá je odvodená z triedy DynamicsBaseHostedControl , aby ste mohli použiť SafeDispatcher.
Rovnako ako WPF Dispatcher, aj SafeDispatcher poskytuje metódy ako BeginInvoke, Invoke a InvokeAsync na synchrónne alebo asynchrónne spúšťanie operácií na SafeDispatcher s ďalším booleovským parametrom, ktorý určuje, runOnMainUiThread
či sa má SafeDispatcher spustiť vo vlákne používateľského rozhrania alebo nie.
SafeDispatcher poskytuje nasledujúce výhody:
Vlákno Protected UI Dispatcher: Vývojári môžu spustiť všetky operácie závislé od používateľského rozhrania na SafeDispatcher nastavením parametra
runOnMainUiThread
na hodnotu "true" v metóde invoke na spustenie vlákna SafeDispatcher on UI. Akákoľvek nespracovaná výnimka vyvolaná v hlavnom dispečeri používateľského rozhrania sa bezpečne spracuje na úrovni ovládacieho prvku na hostiteľskom systéme namiesto prebublávania do globálnej obslužnej rutiny udalosti DispatcherUnhandledException .Chránené vlákno dispečera bez používateľského rozhrania: Vývojári môžu v aplikácii SafeDispatcher spúšťať všetok kód nezávislý od používateľského rozhrania. nastavením parametra
runOnMainUiThread
na "false" v metóde invoke na spustenie SafeDispatchera vo vlákne bez používateľského rozhrania. Akákoľvek neošetrená výnimka vyvolaná hlavnému dispečerovi bez používateľského rozhrania sa bezpečne spracuje na úrovni ovládacieho prvku na hostiteľskom systéme namiesto prebublávania do globálnej obslužnej rutiny udalosti DispatcherUnhandledException .Podrobné informácie o zdroji a príčine výnimky: Obslužný program výnimky SafeDispatcher sa vyvolá, keď je neošetrená výnimka vyvolaná na úrovni DynamicsBaseHostedControl vláknom používateľského rozhrania alebo vláknom bez používateľského rozhrania, čo umožňuje Unified Service Desk zachytiť kritické informácie na úrovni ovládacieho prvku na hostiteľskom systéme, ako je názov ovládacieho prvku na hostiteľskom systéme, typ ovládacieho prvku na hostiteľskom systéme, názov metódy a úplné sledovanie zásobníka na identifikáciu presného umiestnenia a príčiny výnimky.
Konfigurácia alebo prepísanie obslužnej rutiny výnimiek SafeDispatcher: Vývojári môžu použiť predpripravené správanie obslužného programu výnimky SafeDispatcher na zobrazenie výzvy používateľovi na poskytnutie informácií o nespracovanej výnimke alebo prepísanie správania podľa jeho obchodných požiadaviek, ako je konfigurácia ďalšieho zapisovania do denníka, zatvorenie ovládacích prvkov založených na reláciách alebo ukončenie klienta Unified Service Desk.
Ako používať SafeDispečer?
Vlastnosť SafeDispatcher je k dispozícii pre všetky vlastné inštancie ovládacích prvkov na hostiteľskom systéme Unified Service Desk, ktoré sú odvodené z triedy DynamicsBaseHostedControl . Inštancia SafeDispatcher je k dispozícii na spustenie vo vlákne používateľského rozhrania, keď je inicializovaný vlastný ovládací prvok na hostiteľskom systéme. Inštancia SafeDispatcher však bude k dispozícii na spustenie iba vo vlákne bez používateľského rozhrania, keď prvýkrát spustíte metódu invoke.
Synchrónne vyvolanie funkcie špecifickej pre používateľské rozhranie pomocou nástroja SafeDispatcher
SafeDispatcher.Invoke(() => { ProcessData(); }, DispatcherPriority.Normal, CancellationToken.None, true);
ALEBO
SafeDispatcher.Invoke(() => { ProcessData(); }, DispatcherPriority.Normal, CancellationToken.None);
Poznámka
Pre funkciu špecifickú pre používateľské rozhranie by ste mali nastaviť voliteľný
runOnMainUiThread
parameter na hodnotu "true". Ak nezadáte hodnotu pre tento parameter, predvolene sa odovzdá "true". Takže ktorákoľvek z vyššie uvedených definícií metódy funguje dobre.Asynchrónne vyvolajte funkciu špecifickú pre používateľské rozhranie pomocou SafeDispatcher. Môžete použiť buď metódu
BeginInvoke
orInvokeAsync
.SafeDispatcher.BeginInvoke(new Action(() => { ProcessData(); }));
ALEBO
SafeDispatcher.InvokeAsync(new Action(() => { ProcessData(); }));
Prispôsobenie obslužnej rutiny výnimiek SafeDispatcher
So zavedením SafeDispatcheru všetky nespracované výnimky v Unified Service Desk vyvolajú udalosť SafeDispatcherUnhandledException namiesto globálnej udalosti DispatcherUnhandledException. Metóda SafeDispatcherUnhandledExceptionHandler poskytuje predpripravenú obslužnú rutinu výnimiek pre SafeDispatcher na zobrazenie informácií používateľovi Unified Service Desk s nasledujúcimi podrobnosťami: správa zdroja, kde sa výnimka vyskytla, a podrobné informácie o výnimke.
Môžete tiež prepísať predpripravené spracovanie výnimiek pre SafeDispatcher a vykonať inú operáciu, ako je napríklad výzva používateľovi na zatvorenie nedynamického ovládacieho prvku na hostiteľskom systéme založeného na relácii.
Nasledujúci vzorový kód ukazuje, ako môžete prepísať predpripravenú obslužnú rutinu výnimky SafeDispatcher a zobraziť okno so správou, ktoré používateľa vyzve na zatvorenie vlastného ovládacieho prvku na hostiteľskom systéme, keď sa vyskytne výnimka:
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); });
}
}
Migrácia z WPF Dispatcher do SafeDispatcher v existujúcich vlastných ovládacích prvkoch na hostiteľskom systéme
Keďže zmluva medzi WPF Dispatcher a SafeDispatcher je takmer identická, úsilie o prechod z WPF Dispatcher na SafeDispatcher je minimálne. Ak chcete migrovať akúkoľvek inštanciu ovládacieho prvku na hostiteľskom systéme odvodenú z triedy DynamicsBaseHostedControl , nahraďte všetky inštancie "Dispatcher" za "SafeDispatcher".
Zvážte napríklad nasledujúci kód:
Dispatcher.Invoke((System.Action)delegate()
{
DynamicsLogger.Logger.Log("Raising SetupHotKey's", TraceEventType.Verbose);
SetupHotkeys();
CRMGlobalManager.AppWithFocusChanged += CRMGlobalManager_AppWithFocusChanged;
FireEvent("DesktopReady");
InitializeFocusSelection();
});
Nahraďte Dispatcher
vo vyššie uvedenom kóde ; SafeDispatcher
zvyšok kódu zostáva rovnaký:
SafeDispatcher.Invoke((System.Action)delegate()
{
DynamicsLogger.Logger.Log("Raising SetupHotKey's", TraceEventType.Verbose);
SetupHotkeys();
CRMGlobalManager.AppWithFocusChanged += CRMGlobalManager_AppWithFocusChanged;
FireEvent("DesktopReady");
InitializeFocusSelection();
});
Čo treba zvážiť pri používaní SafeDispatcher
SafeDispatcher ponúka viacvláknový model, ktorý je veľmi výhodný pri odosielaní funkcií synchrónne alebo asynchrónne do vlákien používateľského rozhrania alebo bez používateľského rozhrania. Operácie, ktoré je potrebné spustiť na vláknach, ktoré sú k dispozícii s toleranciou chýb, by sa mali vykonávať na SafeDispečeri. Viacvláknové spracovanie by sa však malo implementovať veľmi opatrne, aby sa predišlo zablokovaniu medzi vláknami. Jedným z takýchto príkladov je synchrónne odosielanie z vlákna bez používateľského rozhrania do hlavného dispečera WPF. Pozrime sa na tento príklad:
Thread thread = new Thread(() =>
{
Dispatcher.Invoke(ProcessData);
});
thread.SetApartmentState(ApartmentState.STA);
thread.Priority = ThreadPriority.Highest;
thread.IsBackground = true;
thread.Start();
thread.Join();
Táto thread.Join()
metóda spôsobuje, že sa hlavné vlákno zablokuje a čaká na ukončenie jednovláknového vlákna bytu (STA), ale vlákno STA čaká na dokončenie vykonávania hlavného vlákna ProcessData
. To spôsobí, že vaša aplikácia sa dostane do situácie zablokovania.
Podobne zvážte aj nasledujúci príklad:
// Invoke on STA thread
SafeDispatcher.Invoke(() =>
{
// Invoke back on main dispatcher
SafeDispatcher.Invoke(() =>
{
ProcessData();
});
}, false);
Metóda SafeDispatcherUnhandledExceptionHandler sa volá, ak sa výnimka vyskytne vo WPF Dispatcher alebo vo vlákne STA bez používateľského rozhrania a je vyvolaná v príslušnom vlákne, v ktorom sa výnimka vyskytla. Mali by ste byť opatrní, aby ste sa uistili, že vyššie uvedenú kombináciu neumiestnite do tohto obslužného programu, to znamená, že ak sa výnimka vyskytla vo vlákne bez používateľského rozhrania, neoslaďte synchrónne hlavnému dispečerovi používateľského rozhrania.
protected override void SafeDispatcherUnhandledExceptionHandler(object sender, SafeDispatcherUnhandledExceptionEventArgs ex)
{
Dispatcher.Invoke(LogException); // Incorrect
SafeDispatcher.Invoke(LogException); // Incorrect
SafeDispatcher.BeginInvoke(LogException); // Correct
SafeDispatcher.InvokeAsync(LogException); // Correct
}
Pozri tiež
Vytvorenie vlastného ovládacieho prvku na hostiteľskom systéme Unified Service DeskRozšírenie Unified Service DeskKonfigurácia diagnostického denníka klienta v Unified Service Desk