2013-05-16 2 views
1

У нас были проблемы с WCF, которые занимали у нас много времени, чтобы диагностировать, поэтому я размещаю их здесь, если у кого-то есть подобные проблемы (не найдены ссылки нигде).WCF NullReferenceException в финализаторе

Наши процессы часто врезаться со следующими необработанными исключениями:

System.NullReferenceException: Object reference not set to an instance of an object. 
at System.ServiceModel.Channels.OverlappedContext.CompleteCallback(UInt32 error, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 
at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped) 
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 

System.NullReferenceException: Object reference not set to an instance of an object. 
at System.Threading.Overlapped.Free(NativeOverlapped* nativeOverlappedPtr) 
at System.ServiceModel.Channels.OverlappedContext.Free() 
at System.ServiceModel.Channels.OverlappedContext.FreeOrDefer() 
at System.ServiceModel.Channels.SocketConnection.Abort(TraceEventType traceEventType, String timeoutErrorString, TransferOperation transferOperation) 
at System.ServiceModel.Channels.CommunicationPool`2.EndpointConnectionPool.CloseIdleConnection(TItem connection, TimeSpan timeout) 
at System.ServiceModel.Channels.IdlingCommunicationPool`2.IdleTimeoutEndpointConnectionPool.IdleTimeoutIdleConnectionPool.OnIdle() 
at System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 
at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped) 
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 

System.NullReferenceException: Object reference not set to an instance of an object. 
at System.Threading.Overlapped.Free(NativeOverlapped* nativeOverlappedPtr) 
at System.Net.AsyncRequestContext.Dispose(Boolean disposing) 
at System.Net.RequestContextBase.Finalize() 

Исключения обычно происходило через несколько часов после того, как смотрел этот процесс, иногда через несколько минут.

Странно, что они появятся только после установки обновлений Windows Update (январь 2013 г.) и исчезнут после их удаления.

ответ

3

Проблема оказалась IClientChannel.

Мы позабыли оставить канал после использования и вызвали Dispose() из потока финализатора.

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

После звонка Dispose() из той же темы проблема исчезла.

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