首页 > 解决方案 > 如何使用 StackExchange.Redis 断开与 redis 的连接?

问题描述

我正在运行一个长时间运行的可执行文件(大约 30 分钟的会话),但我只需要在开始时和会话结束时写入 redis 一次。

因此,我想在第一次写入后断开我的 redis 连接,然后在最后重新连接,这样当我不需要它时,我就不会一直使用持久连接。

我试图通过将我的逻辑包装在using块中来断开连接。但是,我得到了这个错误(不是 100% 可重现,但可能大约有 50% 的时间):

System.InvalidOperationException:读取器完成后不允许读取。在 System.IO.Pipelines.Pipe.AdvanceReader(SequencePosition& 消耗,SequencePosition& 检查)

其次是

System.Net.Sockets.SocketException (0x80004005):由于 Pipelines.Sockets.Unofficial.SocketAwaitableEventArgs.g__ThrowSocketException|10_0(SocketError e) 的线程退出或应用程序请求,I/O 操作已中止

at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
at System.Environment.get_StackTrace()
at aag.Natives.Api.DeveloperApi.HtmlLogger.ProcessHtmlMessage(DevLogType logType, String message)
at aag.Natives.Api.DeveloperApi.LogError(String message)
at aag.GameServer.EntryPoint.<>c__DisplayClass47_0.<.ctor>b__1(Object s, FirstChanceExceptionEventArgs e) in E:\dev\LegionTD2_LFS\GameEngine\GameServer\src\GameServer\EntryPoint.cs:line 131
at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)
at DarkRift.ConnectionService.ChunkReadCallback(IAsyncResult result)
at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
at System.Net.ContextAwareResult.CompleteCallback(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.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Net.ContextAwareResult.Complete(IntPtr userToken)
at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

我会以错误的方式解决这个问题吗?或者这个错误是良性的并且应该被忽略?

标签: redisstackexchange.redis

解决方案


推荐阅读