Je reçois cette exception SemaphoreFullException depuis un moment.
Pour résumer .. J'ai hébergé une application sur IIS 7.5 avec un pool d'applications (Framework) ASP.NET v4.0 Framework (intégré) . J'utilise l'authentification Windows pour authentifier mes utilisateurs via le domaine (isinrole) .
J'ai déjà vu toutes les discussions sur ce sujet, où il est suggéré de définir Pooling = False . Je ne veux pas le faire et j'aimerais continuer à utiliser la mise en commun en raison des avantages en termes de performances.
J'utilise Entity Framework 6 pour interroger la base de données et je ne "supprime" pas le dbcontext dans le code utilisateur . Il semble que le problème se trouve dans le code DbConnectionPool.
L'erreur se produit de manière aléatoire à un moment donné. Peu importe si l'application est utilisée ou non. Parfois, à cause de ce problème, je dois redémarrer IIS car les nouveaux utilisateurs ne sont plus authentifiés.
Ce que j'ai essayé jusqu'à présent:
Remarque: Dans mon application, j'ai principalement utilisé des objets linq-to-EF pour interroger la base de données.
Exception: System.Threading.SemaphoreFullException
Message: Adding the specified count to the semaphore would cause it to exceed its maximum count.
StackTrace: at System.Threading.Semaphore.Release(Int32 releaseCount)
at System.Data.ProviderBase.DbConnectionPool.CleanupCallback(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.TimerQueueTimer.CallCallback()
at System.Threading.TimerQueueTimer.Fire()
at System.Threading.TimerQueue.FireNextTimers()
Toute aide à cet égard sera grandement appréciée.
Je pense que cela pourrait être une solution au problème: http://www.davepaquette.com/archive/2013/03/27/managing-entity-framework-dbcontext-lifetime-in-asp-net-mvc. aspx - comme vous pouvez le constater, il est essentiel de veiller à la mise au rebut du DbContext à la fin de sa vie.
N'oubliez pas que les connexions Db aboutissent dans un code de gestion de base non géré. Par conséquent, le problème est que si le garbage collection ne dispose pas du contexte, il reste en veille dans la mémoire principale, bloquant ainsi une connexion du pool de connexions. Donc, tôt ou tard, dans les bonnes conditions, vous videz le pool de connexions et obtenez votre exception.
Dans mon cas, le problème était que j'ai arrêté l'application pendant le débogage. L'application faisait beaucoup d'appels asynchrones.
J'ai donc réinitialisé mon serveur IIS: iisreset
via une invite de commande ou PowerShell, et cela a fonctionné.
J'ai eu le même problème et c'était parce que je faisais .Dispose();
avant de fermer la connexion, voici comment je l'ai résolu:
J'ai eu deux instances de .Dispose();
- une dans un SqlDataAdapter, l'autre dans un SqlCommand et après cela fermait la connexion et obtenait l'erreur . Il suffit de supprimer le .Dispose();
de mon SqlCommand et mon SqlDataAdapter, et plus d'erreur! J'espère que cela aide d'une certaine manière.