Bruge SafeDispatcher til brugerdefinerede tilknyttede kontrolelementer i Unified Service Desk
Gælder for: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2013, Dynamics CRM 2015, Dynamics CRM 2016
Unified Service Desk er et Windows Presentation Foundation (WPF)-baseret program, hvor alle handlinger i Unified Service Desk udføres på den primære WPF-afsender-tråd.WPF-afsender-klassen leverer tjenester til håndtering af køen af arbejdselementer for en tråd.
Du kan udvide Unified Service Desk ved at oprette brugerdefinerede kontrolelementer og tilknytte det i Unified Service Desk. Men hvis et brugerdefineret tilknyttet kontrolelement indeholder fejlbehæftet kode eller udfører handlinger ved hjælp af nye tråde uden korrekt håndtering af undtagelser under kørsel af kode, kan det give stabilitetsproblemer i Unified Service Desk og kan også bevirke, at klientprogrammet fryser eller holder op med at svare. Ikke-afviklede undtagelser i tredjeparts brugerdefinerede kontrolelementer gør det svært for produkt-/supportteamet at identificere, fejlfinde og løse problemet, fordi de ikke nødvendigvis har adgang til oplysningerne. Derfor kan der opstå en fejl/undtagelse i Unified Service Desk og i den kode, der forårsagede fejlen.
Vi introducerer SafeDispatcher, der leverer en effektiv og informativ undtagelseshåndteringsmekanisme til brugerdefinerede tilknyttede kontrolelementer i Unified Service Desk ved hjælp af out-of-box-logføring for ikke-afviklede undtagelser. Du får detaljerede oplysninger om kilden og årsagen til undtagelsen, og du kan konfigurere eller overskrive SafeDispatcher-undtagelseshåndteringen for at udføre visse andre trin. Dette forhindrer også, at Unified Service Desk-klienten ikke svarer på grund af ikke-afviklede undtagelser i koden for det brugerdefinerede tilknyttede kontrolelement.
Bemærkning |
---|
Denne funktion blev introduceret i Unified Service Desk 2.2.1. |
Dette emne indeholder
Hvad er SafeDispatcher?
Sådan bruges SafeDispatcher
Overførsel fra WPF-afsenderen til SafeDispatcher i eksisterende, brugerdefinerede tilknyttede kontrolelementer
Overvejelser ved brug af SafeDispatcher
Hvad er SafeDispatcher?
SafeDispatcher bygger på de samme linjer som WPF-afsender og giver en robust og informativ undtagelseshåndtering for brugerdefinerede tilknyttede kontrolelementer i Unified Service Desk. Det vises som en beskyttet egenskab, SafeDispatcher, i DynamicsBaseHostedControl-klassen, hvilket automatisk gør SafeDispatcher tilgængelig for alle Unified Service Desk brugerdefinerede tilknyttede kontrolelementer, der er afledt af DynamicsBaseHostedControl-klassen.
Bemærkning |
---|
Brug ikke SafeDispatcher-klassen i programkode, der skal fungere sammen med SafeDispatcher. Du skal i stedet bruge SafeDispatcher-egenskaben i din brugerdefinerede tilknyttede kontrolelement-forekomst, som er afledt af DynamicsBaseHostedControl-klassen, for at bruge SafeDispatcher. |
På samme måde som WPF-afsender, indeholder SafeDispatcher metoder som BeginInvoke, Invoke og InvokeAsync til at udføre handlinger synkront eller asynkront på SafeDispatcher med en ekstra boolesk parameter runOnMainUiThread, der styrer, om SafeDispatcher skal køres i brugergrænsefladetråden.
SafeDispatcher giver følgende fordele:
Beskyttet afsender til brugergrænsefladetråd: Udviklere kan køre alle brugergrænsefladeafhængige operationer i SafeDispatcher ved at indstille runOnMainUiThread-parameteren til "true" i aktiveringsmetoden for at køre SafeDispatcher i brugergrænsefladetråden. Enhver ikke-afviklet undtagelse, der er opstået i den primære brugergrænsefladeafsender, håndteres sikkert på niveauet for det tilknyttede kontrolelement i stedet for at ende hos den globale DispatcherUnhandledException-hændelseshandler.
Beskyttet afsender til ikke-brugergrænsefladetråd: Udviklere kan køre al brugergrænseflade-uafhængig kode i SafeDispatcher ved at indstille runOnMainUiThread-parameteren til "false" i aktiveringsmetoden for at køre SafeDispatcher i ikke-brugergrænsefladetråde. Enhver ikke-afviklet undtagelse, der er opstået i den primære ikke-brugergrænsefladeafsender, håndteres sikkert på niveauet for det tilknyttede kontrolelement i stedet for at ende hos den globale DispatcherUnhandledException-hændelseshandler.
Detaljerede oplysninger om undtagelseskilde og -årsag:: SafeDispatcher-undtagelseshandleren opstår, når brugergrænsefladetråden eller ikke-brugergrænsefladetråden udløser en ikke-afviklet undtagelse på DynamicsBaseHostedControl-niveau, som giver Unified Service Desk mulighed for at hente vigtige oplysninger på niveauet for det tilknyttede kontrolelement, f.eks. kontrolelementets navn og type, metodenavn og fuldstændig staksporing, for at identificere den nøjagtige placering og årsag til undtagelsen.
Konfigurere eller tilsidesætte SafeDispatcher-undtagelseshandler: Udviklere kan udnytte out-of-box-funktionsmåden for SafeDispatcher-undtagelseshandleren til at give brugeren oplysninger om den ikke-afviklede undtagelse eller tilsidesætte funktionsmåden i henhold til deres forretningsbehov, f.eks. konfigurere yderligere logføring, lukke sessionsbaserede kontrolelementer eller afslutte Unified Service Desk-klienten.
Sådan bruges SafeDispatcher
SafeDispatcher-egenskaben er tilgængelig for alle Unified Service Desk-forekomster af brugerdefinerede tilknyttede kontrolelementer, der er afledt af DynamicsBaseHostedControl-klassen. En tilgængelig SafeDispatcher-forekomst kan bruges til at køre på brugergrænsefladetråd, når det brugerdefinerede tilknyttede kontrolelement er initialiseret. Forekomsten af SafeDispatcher kan dog kun bruges til at køre på ikke-brugergrænsefladetråd, første gang du udfører aktiveringsmetoden.
Synkron aktivering af en brugergrænsefladespecifik funktion ved hjælp af SafeDispatcher
SafeDispatcher.Invoke(() => { ProcessData(); }, DispatcherPriority.Normal, CancellationToken.None, true);
ELLER
SafeDispatcher.Invoke(() => { ProcessData(); }, DispatcherPriority.Normal, CancellationToken.None);
Bemærkning Ved funktioner, der er specifikke for brugergrænsefladen, du skal indstille den valgfrie runOnMainUiThread-parameter til "true". Hvis du ikke angiver en værdi for denne parameter, bruges standardværdien "true". Så alle ovenstående metodedefinitioner fungerer fint.
Aktivér en brugergrænsefladespecifik funktion asynkront ved hjælp af SafeDispatcher. Du kan bruge enten BeginInvoke- eller InvokeAsync-metoden.
SafeDispatcher.BeginInvoke(new Action(() => { ProcessData(); }));
ELLER
SafeDispatcher.InvokeAsync(new Action(() => { ProcessData(); }));
Tilpasse SafeDispatcher-undtagelseshandleren
Med introduktionen af SafeDispatcher medfører alle ikke-afviklede undtagelser i Unified Service DeskSafeDispatcherUnhandledException Event i stedet for den globale DispatcherUnhandledException-hændelse.SafeDispatcherUnhandledExceptionHandler Method leverer en out-of-box-undtagelseshandler til SafeDispatcher, så brugeren af Unified Service Desk kan se følgende oplysninger: versionsstyring på det sted, hvor undtagelsen opstod, og detaljerede oplysninger om undtagelsen.
Du kan også tilsidesætte out-of-box-undtagelseshåndtering SafeDispatcher for at udføre andre handlinger som f.eks. bede brugeren om at lukke et sessions-baseret, ikke-dynamisk tilknyttet kontrolelement.
Følgende eksempelkode viser, hvordan du kan tilsidesætte out-of-box SafeDispatcher-undtagelseshandleren for at vise et meddelelsesfelt, hvor brugeren bliver bedt om at lukke det brugerdefinerede tilknyttede kontrolelement, når der opstår en undtagelse:
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); });
}
}
Overførsel fra WPF-afsenderen til SafeDispatcher i eksisterende, brugerdefinerede tilknyttede kontrolelementer
Kontrakten mellem WPF-afsenderen og SafeDispatcher er næsten identisk, og derfor kræver det kun en minimal indsats at flytte fra WPF-afsenderen til SafeDispatcher. Du kan overføre eventuelle forekomster af tilknyttede kontrolelementer, der er afledt af DynamicsBaseHostedControl-klassen ved at erstatte alle "Dispatcher"-forekomster med "SafeDispatcher".
Overvej f.eks. følgende kode:
Dispatcher.Invoke((System.Action)delegate()
{
DynamicsLogger.Logger.Log("Raising SetupHotKey's", TraceEventType.Verbose);
SetupHotkeys();
CRMGlobalManager.AppWithFocusChanged += CRMGlobalManager_AppWithFocusChanged;
FireEvent("DesktopReady");
InitializeFocusSelection();
});
Erstat Dispatcher i ovenstående kode med SafeDispatcher. Resten af koden forbliver uændret:
SafeDispatcher.Invoke((System.Action)delegate()
{
DynamicsLogger.Logger.Log("Raising SetupHotKey's", TraceEventType.Verbose);
SetupHotkeys();
CRMGlobalManager.AppWithFocusChanged += CRMGlobalManager_AppWithFocusChanged;
FireEvent("DesktopReady");
InitializeFocusSelection();
});
Overvejelser ved brug af SafeDispatcher
SafeDispatcher giver dig en flertrådet model, der er meget nyttig ved synkron eller asynkron afsendelse af funktioner til brugergrænsefladetråde eller ikke-brugergrænsefladetråde. Handlinger, der skal køres på tråde, der er tilgængelige med fejltolerance, skal udføres i SafeDispatcher. Men multitrådning skal implementeres meget omhyggeligt for at undgå en baglås mellem tråde. Et eksempel på dette er afsendelse fra en ikke-brugergrænsefladetråd til den primære WPF-afsender synkront. Lad os se nærmere på dette eksempel:
Thread thread = new Thread(() =>
{
Dispatcher.Invoke(ProcessData);
});
thread.SetApartmentState(ApartmentState.STA);
thread.Priority = ThreadPriority.Highest;
thread.IsBackground = true;
thread.Start();
thread.Join();
thread.Join()-metoden bevirker, at den primære tråd blokeres, mens den venter på afslutningen af STA-tråden (Single-Threaded Apartment), men STA-tråden venter på, at den primære tråd afslutter udførelsen af ProcessData. Dette får appen til at gå i baglås.
Overvej også følgende eksempel:
// Invoke on STA thread
SafeDispatcher.Invoke(() =>
{
// Invoke back on main dispatcher
SafeDispatcher.Invoke(() =>
{
ProcessData();
});
}, false);
SafeDispatcherUnhandledExceptionHandler Method bliver kaldt, hvis der opstår en undtagelse i WPF-afsenderen eller i STA'ens ikke-brugergrænsefladetråd, og udløses i den tråd, hvor undtagelsen opstod. Du skal sørge for ikke at placere ovenstående kombination i denne handler, dvs. at hvis undtagelsen opstod på ikke-brugergrænsefladetråd, skal du ikke afsende synkront til den primære brugergrænsefladeafsender.
protected override void SafeDispatcherUnhandledExceptionHandler(object sender, SafeDispatcherUnhandledExceptionEventArgs ex)
{
Dispatcher.Invoke(LogException); // Incorrect
SafeDispatcher.Invoke(LogException); // Incorrect
SafeDispatcher.BeginInvoke(LogException); // Correct
SafeDispatcher.InvokeAsync(LogException); // Correct
}
Se også
Gennemgang: Oprette et brugerdefineret tilknyttet kontrolelement til Unified Service Desk
Udvide Unified Service Desk
TechNet: Konfigurere logføring af klientdiagnosticering i Unified Service Desk
Unified Service Desk 2.0
© 2017 Microsoft. Alle rettigheder forbeholdes. Ophavsret