2881099 / FreeRedis

🦄 FreeRedis is .NET40+ redis client. supports cluster, sentinel, master-slave, pub-sub, lua, pipeline, transaction, streams, client-side-caching, and pooling.
MIT License
920 stars 164 forks source link

连接Redis成功后,上锁,然后模拟断开会令到控制台程序异常退出 #171

Open YBenLee opened 9 months ago

YBenLee commented 9 months ago

`RedisClient redisClient = new RedisClient("xxxxx");

        while (true)
        {
            try
            {
                var l = redisClient.Lock("console_test", 1);
                if (null != l)
                {
                    Console.WriteLine("获取锁成功.");
                }
                else
                {
                    Console.WriteLine("获取锁失败");
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine($"异常:{ex.Message}");
            }

            Thread.Sleep(1000);
        }`

先连接成功,再使用工具模拟断网 image

之后就会不断的抛出异常,然后控制台程序会退出

2881099 commented 9 months ago

获取锁之后,使用了没释放

YBenLee commented 9 months ago

您好,我最近无法亲自回复您的邮件。尽快给您回复。

YBenLee commented 9 months ago

获取锁之后,使用了没释放

我只是示例,即使释放也是会导致程序崩溃退出的。我使用全局捕抓异常也不行。

        // 注册未处理异常事件处理程序
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionHandler);

        TaskScheduler.UnobservedTaskException += new EventHandler<UnobservedTaskExceptionEventArgs>(UnobservedTaskExceptionHandler);
2881099 commented 9 months ago

这个错误是执行命令后,服务器没响应

YBenLee commented 9 months ago

这个错误是执行命令后,服务器没响应

我希望的是,即使服务器无响应都不应该导致我程序异常退出。

因为有可能会是网络波动,但原本我是正常连接的。但网络波动之后,捕获不了所有异常处理。导致程序被动退出了。其实应该在网络波动的时候,降频重连等待网络恢复,这是我期望的。 image

一直是在RespHelper这个类里面报错。 image

[异常] System.Net.Sockets.dll!System.Net.Sockets.NetworkStream.Read(System.Span<byte> buffer) 未知
[异常] System.Net.Sockets.dll!System.Net.Sockets.NetworkStream.ReadByte() 未知

[异常] FreeRedis.dll!FreeRedis.RespHelper.Resp3Reader.ReadObject(System.Text.Encoding encoding) 行 207 C# [异常] FreeRedis.dll!FreeRedis.Internal.DefaultRedisSocket.Read(FreeRedis.CommandPacket cmd) 行 180 C# [异常] FreeRedis.dll!FreeRedis.Internal.DefaultRedisSocket.TempProxyRedisSocket.Read(FreeRedis.CommandPacket cmd) 行 70 C# [异常] FreeRedis.dll!FreeRedis.RedisClient.PoolingAdapter.AdapterCall.AnonymousMethod0() 行 80 C# [异常] FreeRedis.dll!FreeRedis.RedisClient.LogCallCtrl(FreeRedis.CommandPacket cmd, System.Func func, bool aopBefore, bool aopAfter) 行 98 C# [异常] FreeRedis.dll!FreeRedis.RedisClient.LogCall(FreeRedis.CommandPacket cmd, System.Func func) 行 93 C# [异常] FreeRedis.dll!FreeRedis.RedisClient.PoolingAdapter.AdapterCall(FreeRedis.CommandPacket cmd, System.Func<FreeRedis.RedisResult, TValue> parse) 行 70 C# [异常] FreeRedis.dll!FreeRedis.RedisClient.Call(FreeRedis.CommandPacket cmd, System.Func<FreeRedis.RedisResult, TValue> parse) 行 91 C# [异常] FreeRedis.dll!FreeRedis.RedisClient.Eval(string script, string[] keys, object[] arguments) 行 32 C# [异常] FreeRedis.dll!FreeRedis.RedisClient.LockController.Refresh(int milliseconds) 行 82 C# [异常] FreeRedis.dll!FreeRedis.RedisClient.LockController..ctor.AnonymousMethod0(object state2) 行 53 C# [异常] System.Private.CoreLib.dll!System.Threading.TimerQueueTimer..cctor.AnonymousMethod__27_0(object state) 未知 [异常] System.Private.CoreLib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) 未知 System.Private.CoreLib.dll!System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 未知 System.Private.CoreLib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) 未知 System.Private.CoreLib.dll!System.Threading.TimerQueueTimer.CallCallback(bool isThreadPool) 未知 System.Private.CoreLib.dll!System.Threading.TimerQueueTimer.Fire(bool isThreadPool) 未知 System.Private.CoreLib.dll!System.Threading.TimerQueue.FireNextTimers() 未知 System.Private.CoreLib.dll!System.Threading.TimerQueue.AppDomainTimerCallback(int id) 未知 [本机到托管的转换]
[托管到本机的转换]
System.Private.CoreLib.dll!System.Threading.UnmanagedThreadPoolWorkItem.System.Threading.IThreadPoolWorkItem.Execute() 未知 System.Private.CoreLib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch() 未知 System.Private.CoreLib.dll!System.Threading.PortableThreadPool.WorkerThread.WorkerThreadStart() 未知 System.Private.CoreLib.dll!System.Threading.Thread.StartCallback() 未知