Olá
Eu tenho um erro "OutOfMemoryException" usando .NET CORE 2.2.
A descrição completa do erro é:
System.OutOfMemoryException:
em System.MulticastDelegate.CombineImpl (System.Private.CoreLib, Versão = 4.0.0.0, Cultura = neutra, PublicKeyToken = 7cec85d7bea7798e)
em StackExchange.Redis.ConnectionMultiplexer.add_ConnectionRestored (StackExchange.Redis, Versão = 2.0.0.0, Cultura = neutra, PublicKeyToken = c219ff1ca8c2ce46)
em V1.Sdk.Infra.Repository.RedisRepository.RegisterEvent (V1.Sdk.Infra, Versão = 1.0.0.0, Cultura = neutra, PublicKeyToken = nulo)
em V1.Sdk.Infra.Repository.RedisRepository.get_ConnectionMultiplexer (V1.Sdk.Infra, Versão = 1.0.0.0, Cultura = neutro, PublicKeyToken = nulo)
em V1.Sdk.Infra.Repository.RedisRepository.GetDatabase (V1.Sdk.Infra, Versão = 1.0.0.0, Cultura = neutra, PublicKeyToken = nulo)
em Vix.V1.Application.Services.Motorista.MotoristaService +d__17.MoveNext (Vix.V1.Application, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = nullVix.V1.Application, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null: d: \ a \ 1 \ s \ Vix.V1.Application \ Services \ Driver \ DriverService.ObterLogado.csVix.V1.Application, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null: 31)
em System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (System.Private.CoreLib, Versão = 4.0.0.0, Cultura = neutra, PublicKeyToken = 7cec85d7bea7798e)
em System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Private.CoreLib, Versão = 4.0.0.0, Cultura = neutra, PublicKeyToken = 7cec85d7bea7798e)
em System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Private.CoreLib, Versão = 4.0.0.0, Cultura = neutra, PublicKeyToken = 7cec85d7bea7798e)
em Vix.V1.Application.Services.Location.LocationService +d__2.MoveNext (Vix.V1.Application, Version = 1.0.0.0, Culture = neutro, PublicKeyToken = nullVix.V1.Application, Version = 1.0.0.0, Culture = neutro, PublicKeyToken = null: d: \ a \ 1 \ s \ Vix.V1.Application \ Services \ Location \ LocationService.UpdatePosition.csVix.V1.Application, Version = 1.0.0.0, Culture = neutro, PublicKeyToken = null: 27)
A classe que você usa para acessar o redis é:
public class RedisRepository
{
private static readonly object Locker = new object ();
private static IConnectionMultiplexer _connMultiplexer;
private static IConnectionMultiplexer ConnectionMultiplexer
{
get
{
if (_connMultiplexer == null ||! _connMultiplexer.IsConnected)
{
lock (Locker)
{
if (_connMultiplexer == null ||! _connMultiplexer.IsConnected)
{
_connMultiplexer = Connection;
}
}
}
RegisterEvent ();
return _connMultiplexer;
}
}
private static readonly Lazy <ConnectionMultiplexer> LazyConnection = new Lazy <ConnectionMultiplexer> (() =>
{
var connection = StackExchange.Redis.ConnectionMultiplexer.Connect (AppContextSdk.Configuration.GetConnectionString ("RedisConnection"));
return connection;
});
private static ConnectionMultiplexer Connection => LazyConnection.Value;
public static IDatabase GetDatabase ()
{
return ConnectionMultiplexer.GetDatabase (0);
}
private static void RegisterEvent ()
{
_connMultiplexer.ConnectionRestored + = ConnMultiplexer_ConnectionRestored;
_connMultiplexer.ConnectionFailed + = ConnMultiplexer_ConnectionFailed;
_connMultiplexer.ErrorMessage + = ConnMultiplexer_ErrorMessage;
_connMultiplexer.InternalError + = ConnMultiplexer_InternalError;
}
private static void ConnMultiplexer_ConnectionRestored (object sender, ConnectionFailedEventArgs and)
{
}
private static void ConnMultiplexer_ConnectionFailed (object sender, ConnectionFailedEventArgs and)
{
}
private static void ConnMultiplexer_ErrorMessage (object sender, RedisErrorEventArgs e)
{
}
private static void ConnMultiplexer_InternalError (object sender, InternalErrorEventArgs e)
{
}
}
O Redis usado é o Cache Redis Premium de 6 GB do Azure.
Alguma idéia do que pode ser ou o que você deve fazer para resolvê-lo? Até lá a solução é reiniciar o App Service
O problema é sua propriedade ConnectionMultiplexer
. Cada vez que é acessado, ele adiciona registros de eventos adicionais . Eventualmente, isso vai explodir. Antes disso, é apenas uma péssima ideia. Então... não faça isso?
Perfeito! Foi exatamente neste ponto!
Obrigada!
ConnectionMultiplexer é thread-safe e não requer um cadeado,
` Instância de ConnectionMultiplexer estática pública
{
pegue
{
return conn.Value;
}
}
private static Lazy<ConnectionMultiplexer> conn = new Lazy<ConnectionMultiplexer>(
() =>
{
_instance = ConnectionMultiplexer.Connect(RedisPath);
//adds additional event registrations
_instance.ConnectionFailed += MuxerConnectionFailed;
_instance.ConnectionRestored += MuxerConnectionRestored;
_instance.ErrorMessage += MuxerErrorMessage;
_instance.HashSlotMoved += MuxerHashSlotMoved;
_instance.InternalError += MuxerInternalError;
return _instance;
}
);`
e você pode tentar usar minha ferramenta empacotada para pesquisar 'Banana.Utility' no nuget.
Comentários muito úteis
ConnectionMultiplexer é thread-safe e não requer um cadeado,
` Instância de ConnectionMultiplexer estática pública
{
pegue
{
return conn.Value;
}
}
e você pode tentar usar minha ferramenta empacotada para pesquisar 'Banana.Utility' no nuget.