Асинхронное ведение журнала, генерирующее исключение NullReferenceException

Я пытаюсь асинхронно записывать некоторую информацию в SQL Server внутри действия контроллера MVC 4, нацеленного на .NET 4.0, используя AsyncTargetingPack. Я бы прыгнул прямо к .NET 4.5, но мое приложение живет в Azure имы'все еще жду обновления...

Этот код работает как положено (в мою базу данных записана строка без исключений):

public class SystemActionLogger : ISystemActionLogger
{
    private readonly ActionBlock actionBlock;

    public SystemActionLogger(ISystemActionLogEntryRepository repository)
    {
        actionBlock = new ActionBlock(
            entry => TaskEx.Run(async () =>
                {
                    string 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:

public class SystemActionLogger : ISystemActionLogger
{
    private readonly ActionBlock actionBlock;

    public SystemActionLogger(ISystemActionLogEntryRepository repository)
    {
        actionBlock = new ActionBlock(async entry =>
            {
                string 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: "В экземпляре объекта не задана ссылка на объект."

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.CompilerServices.TaskAwaiter.c__DisplayClassa.b__0(Task param0)

Exception rethrown at [0]: 
   at System.Runtime.CompilerServices.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()

Я не вижу исключения, поскольку это весь внешний код. Я неЯ не понимаю, почему второй блок кода не работает. Это код, который я изначально написал.

Что я делаю неправильно?

 Stephen Cleary19 окт. 2012 г., 14:15
ASP.NET нуждается в специальной поддержкеasync, который был добавлен в .NET 4.5. Я не стал бы пытаться использовать Async Targeting Pack в приложениях ASP.NET для .NET 4.0 - несколько простых вещей могли бы работать, но конвейер ASP.NET просто не готов увидетьasync код.
 Stephen Cleary19 окт. 2012 г., 16:28
Я думаю, что лучший вариант сейчас просто подождать. Azure должен быть обновлен в этом месяце в соответствии с ScottGu. А пока яЯ использую AppHarbor, который почти сразу поддержал .NET 4.5.
 David Peden19 окт. 2012 г., 17:07
Да яя с нетерпением ждал со времен RTW. Я'Я просто скрещиваю пальцы, что они нене стоит забывать о развертывании на основе ролей, поскольку они говорят только о веб-сайтах. Я видел @scottgu 'пост и мои пальцы скрещены ...
 David Peden19 окт. 2012 г., 15:44
Привет, Стивен, спасибо за ответ. Я видел подобный ответ от вас на другом посте SO и надеялся, что это не так, тем более что первый блок кода работает. Что касается типа, на моем компьютере установлен .NET 4.5, но я не пытался перепрыгивать через обручи и делать его частью моего пакета развертывания в Azure. Тот'интересное наблюдение
 Stephen Cleary19 окт. 2012 г., 14:16
Ваша трассировка стека содержит ссылку наLegacyAspNetSynchronizationContextтип, добавленный в .NET 4.5. Вы установили .NET 4.5 на свой сервер Azure?

Ответы на вопрос(3)

что выработает на .NET 4.0 не поддерживается и, вероятно, почему вывидим ложные исключения.

ithCurrentThread при использовании задачи ведения журнала).

Проблема, с которой я столкнулся, заключалась в том, что исходное действие не дожидалось завершения задачи ведения журнала, поэтому, когда журнал завершает работу и пытается воссоединиться с исходным потоком, создается nullReference, поскольку исходный поток завершается.

Это было решено для меня, убедившись, что контроллер запросов ожидает функцию регистрации.

когда мой веб-сервис вызывал другой сервис WCF асинхронным способом. Я просто добавил короткое времяWait() как я неt заботится об ответе (событие телеметрии).

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

Ваш ответ на вопрос