J'ai un problème dans mon application: À un certain point, la SynchronizationContext.Le courant devient nul pour le thread principal. Je suis incapable de reproduire le même problème dans un cas isolé projet. Mon projet est complexe; il mêle les Windows Forms et WPF et les appels de Services Web WCF. Autant que je sache, ce sont tous les systèmes qui peuvent interagir avec le SynchronizationContext.
C'est le code de mon isolé projet. Ma vraie application fait quelque chose qui ressemble à ça. Cependant, dans mon application réelle de la SynchronizationContext.Le courant est nulle sur le thread principal lorsque la poursuite de la tâche est exécutée.
private void button2_Click(object sender, EventArgs e)
{
if (SynchronizationContext.Current == null)
{
Debug.Fail("SynchronizationContext.Current is null");
}
Task.Factory.StartNew(() =>
{
CallWCFWebServiceThatThrowsAnException();
})
.ContinueWith((t) =>
{
//update the UI
UpdateGUI(t.Exception);
if (SynchronizationContext.Current == null)
{
Debug.Fail("SynchronizationContext.Current is null");
}
}, CancellationToken.None,
TaskContinuationOptions.OnlyOnFaulted,
TaskScheduler.FromCurrentSynchronizationContext());
}
Quelle est la cause de la SynchronizationContext.Courant de le thread principal pour devenir nulle?
Edit:
@Hans demandé la trace de la pile. Ici, il est:
au MyApp.Cadre.L'INTERFACE utilisateur.Commandes.AsyncCommand.HandleTaskError(Tâche) dans d:\sources\s2\Framework\Sources\UI\Commands\AsyncCommand.cs:line 157 au Système.Le filetage.Les tâches.De la tâche.c__DisplayClassb.b__un(Object obj) au Système.Le filetage.Les tâches.De la tâche.InnerInvoke() au Système.Le filetage.Les tâches.De la tâche.Execute() au Système.Le filetage.Les tâches.De la tâche.ExecutionContextCallback(Object obj) au Système.Le filetage.ExecutionContext.runTryCode(Objet userData) au Système.Moment de l'exécution.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Objet userData) au Système.Le filetage.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback rappel, état de l'Objet) au Système.Le filetage.ExecutionContext.Exécuter(ExecutionContext executionContext, ContextCallback rappel, état de l'Objet, Boolean ignoreSyncCtx) au Système.Le filetage.Les tâches.De la tâche.ExecuteWithThreadLocal(Tâche& currentTaskSlot) au Système.Le filetage.Les tâches.De la tâche.ExecuteEntry(Boolean bPreventDoubleExecution) au Système.Le filetage.Les tâches.SynchronizationContextTaskScheduler.PostCallback(Object obj) au Système.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo méthode, l'Objet cible, Object[] arguments, SignatureStruct& sig, les attributs MethodAttributes méthode, RuntimeType typeOwner) au Système.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo méthode, l'Objet cible, Object[] arguments, Signature sig, les attributs MethodAttributes méthode, RuntimeType typeOwner) au Système.De la réflexion.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder Binder, Object[] paramètres, CultureInfo culture, skipVisibilityChecks Booléens) au Système.Délégué.DynamicInvokeImpl(Object[] args) au Système.De Windows.Les formulaires.De contrôle.InvokeMarshaledCallbackDo(ThreadMethodEntry tme) au Système.De Windows.Les formulaires.De contrôle.InvokeMarshaledCallbackHelper(Object obj) au Système.Le filetage.ExecutionContext.runTryCode(Objet userData) au Système.Moment de l'exécution.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Objet userData) au Système.Le filetage.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback rappel, état de l'Objet) au Système.Le filetage.ExecutionContext.Exécuter(ExecutionContext executionContext, ContextCallback rappel, état de l'Objet, Boolean ignoreSyncCtx) au Système.Le filetage.ExecutionContext.Exécuter(ExecutionContext executionContext, ContextCallback rappel, état de l'Objet) au Système.De Windows.Les formulaires.De contrôle.InvokeMarshaledCallback(ThreadMethodEntry tme) au Système.De Windows.Les formulaires.De contrôle.InvokeMarshaledCallbacks() au Système.De Windows.Les formulaires.De contrôle.WndProc(Message& m) au Système.De Windows.Les formulaires.De contrôle.ControlNativeWindow.OnMessage(Message& m) au Système.De Windows.Les formulaires.De contrôle.ControlNativeWindow.WndProc(Message& m) au Système.De Windows.Les formulaires.NativeWindow.Rappel(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) au Système.De Windows.Les formulaires.UnsafeNativeMethods.DispatchMessageW(MSG& msg) au System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 raison, Int32 pvLoopData) au Système.De Windows.Les formulaires.Application.ThreadContext.RunMessageLoopInner(Int32 raison, ApplicationContext contexte) au Système.De Windows.Les formulaires.Application.ThreadContext.RunMessageLoop(Int32 raison, ApplicationContext contexte) au Système.De Windows.Les formulaires.Application.Exécuter(Formulaire mainForm) au MyApp.Cadre.SharedUI.ApplicationBase.InternalStart() dans d:\sources\s2\Framework\Sources\UI\SharedUI\ApplicationBase.cs:line 190 au MyApp.Cadre.SharedUI.ApplicationBase.Start() dans d:\sources\s2\Framework\Sources\UI\SharedUI\ApplicationBase.cs:line 118 au MyApp.App1.WinUI.HDA.Main() dans d:\sources\s2\App1\Sources\WinUI\HDA.cs:line 63