Haw*_*xby 6 asp.net task-parallel-library async-await c#-5.0
我目前遇到IIS崩溃的问题,在事件日志中留下以下消息.他们在指导错误的实际来源方面没有太大帮助,但是一些研究表明,这只是产生任务的情况,而不是等待结果,如果父进程完成它们最终完成它不能与导致空引用异常的父线程相关联.那是对的吗?
在大多数情况下,我已经删除或添加了等待这种情况,但在某些方面它很方便.一个这样的例子是会话开始是内存缓存会话特有的一些细节,但是它们并不重要,所以我启动任务来完成这项工作,但不等待它.
我已经添加了ConfigureAwait(false),这是否足以防止将来出现错误?听起来这将删除线程切换,我认为这将防止错误.
Task.Run(() =>
{
// Do caching here
}).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
.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()
Run Code Online (Sandbox Code Playgroud)
应用程序错误
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
Run Code Online (Sandbox Code Playgroud)
经过一个上午的追逐这个问题,我最终发现有一条路径可以让父级绕过创建这个问题的等待。为防止出现这种情况而进行的快速重构解决了该问题。
以最简单的形式,导致问题的代码是这样的:
var getDataTask = getData();
if(some_condition == true) {
return some_object;
}
getDataTask.Wait();
return getDataTask.result;
Run Code Online (Sandbox Code Playgroud)
如果some_condition == true该方法将在不等待getDataTask完成的情况下返回。重构以阻止它修复它。
| 归档时间: |
|
| 查看次数: |
4773 次 |
| 最近记录: |