Journalisation asynchrone levant une exception NullReferenceException

J’essaie de consigner de manière asynchrone certaines informations sur SQL Server dans le cadre d’une action de contrôleur MVC 4 visant .NET 4.0 à l’aide de AsyncTargetingPack. Je voudrais passer directement à .NET 4.5, mais mon application réside dans Azure et nous attendons toujours la mise à jour …

Ce code fonctionne comme prévu (une ligne est écrite dans ma firebase database sans exception):

public class SystemActionLogger : ISystemActionLogger { private readonly ActionBlock<Tuple> actionBlock; public SystemActionLogger(ISystemActionLogEntryRepository repository) { actionBlock = new ActionBlock<Tuple>( entry => TaskEx.Run(async () => { ssortingng data = await JsonConvert.SerializeObjectAsync(entry.Item2); await repository.PersistAsync(new SystemActionLogEntry(entry.Item1, data)); })); } public void Log(SystemAction systemAction, object data) { actionBlock.Post(new Tuple(systemAction, data)); } } 

Et ce code lève une exception NullReferenceException:

 public class SystemActionLogger : ISystemActionLogger { private readonly ActionBlock<Tuple> actionBlock; public SystemActionLogger(ISystemActionLogEntryRepository repository) { actionBlock = new ActionBlock<Tuple>(async entry => { ssortingng data = await JsonConvert.SerializeObjectAsync(entry.Item2); await repository.PersistAsync(new SystemActionLogEntry(entry.Item1, data)); }); } public void Log(SystemAction systemAction, object data) { actionBlock.Post(new Tuple(systemAction, data)); } } 

NullReferenceException: “La référence à l’object n’est pas définie sur une instance d’object.”

 Server stack trace: at System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext) at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext) at System.Web.LegacyAspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback callback, Object state) at System.Web.LegacyAspNetSynchronizationContext.CallCallback(SendOrPostCallback callback, Object state) at System.Runtime.ComstackrServices.TaskAwaiter.c__DisplayClassa.b__0(Task param0) Exception rethrown at [0]: at System.Runtime.ComstackrServices.AsyncMethodBuilderCore.b__1(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() at System.Threading.ThreadPoolWorkQueue.Dispatch() 

Je n’ai aucune visibilité sur l’exception car il s’agit de code externe. Je ne comprends pas pourquoi le deuxième bloc de code échoue. C’est le code que j’ai écrit à l’origine.

Qu’est-ce que je fais mal?

    J’avais juste un problème très similaire (NullReference de AssociateWithCurrentThread lors de l’utilisation d’une tâche de journalisation).

    Le problème que je rencontrais était que l’action d’origine n’attendait pas l’achèvement de la tâche de journalisation. Par conséquent, lorsque le journal se termine et tente de rejoindre le thread d’origine, une référence null est renvoyée car celui-ci est terminé.

    Cela a été résolu pour moi en m’assurant que le contrôleur de demandes attend la fonction de journalisation.

    Le stream de données ne fonctionne que sur .NET 4.5. Le fait que vous l’exécutiez sur .NET 4.0 n’est pas pris en charge et constitue probablement la raison pour laquelle vous rencontrez des exceptions parasites.

    J’ai eu ce problème avec .net4.5 lorsque mon service Web appelait un autre service WCF de manière asynchrone. J’ai simplement ajouté un Wait() chronométré car je ne me souciais pas de la réponse (événement de télémésortinge).

     public static void Event(ssortingng key, ssortingng message) { Telemetry.Event(key, message).Wait(100); }