2013-09-12 3 views
6

У меня возникают проблемы с сбоем IIS, оставляя в журнале событий следующие сообщения. Они не слишком полезны для того, чтобы направлять меня к фактическому источнику ошибки, но немного исследований показывают, что это всего лишь случай нерестовых задач, но не ждет результата, когда они в конечном итоге завершаются, если родительский процесс завершил его, быть связаны с родительской нитью, которая вызывает нулевое опорное исключение. Это верно?Асинхронный код без ожидания завершения

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

I have added ConfigureAwait(false), является ли это достаточным для предотвращения ошибки в будущем? Похоже, что это приведет к отключению переключения потоков, которое, как я полагаю, предотвратит ошибку.

Task.Run(() => 
{ 
    // Do caching here 

}).ConfigureAwait(false); 

ASP.NET 4.0.30319.0

Exception: System.NullReferenceException 

Message: Object reference not set to an instance of an object. 

StackTrace: 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.Threading.Tasks.AwaitTaskContinuation.RunCallback(ContextCallback callback, Object state, Task& currentTask) 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Threading.Tasks.AwaitTaskContinuation.<ThrowAsyncIfNecessary>b__1(Object s) 
    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() 

.NET время выполнение

Application: w3wp.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.NullReferenceException 
Stack: 
    at System.Threading.Tasks.AwaitTaskContinuation.<ThrowAsyncIfNecessary>b__1(System.Object) 
    at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 
    at System.Threading.ThreadPoolWorkQueue.Dispatch() 

Ошибка приложения

Faulting application name: w3wp.exe, version: 7.5.7601.17514, time stamp: 0x4ce7afa2 
Faulting module name: KERNELBASE.dll, version: 6.1.7601.18015, time stamp: 0x50b8479b 
Exception code: 0xe0434352 
Fault offset: 0x0000000000009e5d 
Faulting process id: 0x1d98 
Faulting application start time: 0x01ceaf8ea10ece66 
Faulting application path: c:\windows\system32\inetsrv\w3wp.exe 
Faulting module path: C:\Windows\system32\KERNELBASE.dll 
Report Id: 341b9a76-1b82-11e3-8e17-005056be0005 
+0

'ConfigureAwait()' не имеет смысла без 'ожидания '. – svick

+0

Имеет ли смысл использовать ThreadPool.QueueUserWorkItem? – Hawxby

+0

IIS планирует обработку запросов к пулу потоков .NET. Если вы не выполняете параллельную работу в одном и том же запросе, использование 'Task.Run' и' ThreadPool.QueueUserWorkItem' будет зависеть от производительности каждого выполняющегося запроса, поскольку оно будет выполнять ненужное переключение контекста. –

ответ

4

После утренней чеканки этой проблемы вокруг, я в конце концов обнаружил был путь который может позволить родителям обойти ожидания, создавая эту проблему. Быстрый рефакторинг для предотвращения этой проблемы.

В своей наиболее простой форме кода, вызывающего проблемы была вдоль линий этого

var getDataTask = getData(); 

if(some_condition == true) { 
    return some_object; 
} 

getDataTask.Wait(); 

return getDataTask.result; 

If some_condition == истинный метод будет возвращать, не дожидаясь getDataTask, чтобы закончить. Рефакторинг, чтобы остановить это исправление

+0

Я также страдаю этим же исключением случайным образом. Можете ли вы предоставить более подробную информацию, пожалуйста? Как выглядит ваш код? – deerchao

+2

Я бы не рекомендовал этот код. У вас по-прежнему есть кодовый код, который опасен, это веб-приложение, плюс вы ввели блокирующий вызов с помощью функции Wait(). Действительно ли getData() действительно делает что-то такое, что отнимает много времени, что ожидание этого не является вариантом? Кроме того, существует ли какая-либо значительная работа с ЦП или интенсивностью ввода-вывода, которая должна быть выполнена, чтобы придумать значение «some_condition» или это просто простая проверка на некоторое значение, которое у вас уже есть? –

+2

Извините, я должен уточнить, я тоже не рекомендую это, это был код, вызывающий проблему – Hawxby

Смежные вопросы