У меня возникают проблемы с сбоем 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
'ConfigureAwait()' не имеет смысла без 'ожидания '. – svick
Имеет ли смысл использовать ThreadPool.QueueUserWorkItem? – Hawxby
IIS планирует обработку запросов к пулу потоков .NET. Если вы не выполняете параллельную работу в одном и том же запросе, использование 'Task.Run' и' ThreadPool.QueueUserWorkItem' будет зависеть от производительности каждого выполняющегося запроса, поскольку оно будет выполнять ненужное переключение контекста. –