我有一个webjob,它不断地向redis插入数据,我有另一个时间触发函数,每5分钟从同一个redis缓存读取一次数据。
public static void ProcessData([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer)
{
var newCacheclient = new RedisCacheClient(Program.spRedisCacheConnectionPoolMgr, Program.serializer, Program.redisConfiguration).Db0;
var cachedData = newCacheclient.GetAsync<List<MyObject>>("mydata").Result;
在执行10-15分钟后,我从时间触发函数得到以下错误。有人知道如何解决这个问题吗?
invalidoperationexception:读取器完成后不允许读取。
我也向github提出了同样的问题。
nuget版本详细信息-
错误堆栈-内部异常1:
InvalidOperationException: Reading is not allowed after reader was completed.
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at MyData.Functions.ExecuteTrade(TimerInfo myTimer) in C:\Users\\Functions.cs:line 27
at Microsoft.Azure.WebJobs.Host.Executors.VoidMethodInvoker`1.InvokeAsync(TReflected instance, Object[] arguments)
at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`1.<InvokeAsync>d__0.MoveNext()
at System.IO.Pipelines.ThrowHelper.ThrowInvalidOperationException_NoReadingAllowed()
at System.IO.Pipelines.Pipe.AdvanceReader(SequencePosition& consumed, SequencePosition& examined)
at System.IO.Pipelines.Pipe.DefaultPipeReader.AdvanceTo(SequencePosition consumed, SequencePosition examined)
at StackExchange.Redis.PhysicalConnection.<ReadFromPipe>d__110.MoveNext() in /_/src/StackExchange.Redis/PhysicalConnection.cs:line 1495
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at StackExchange.Redis.Extensions.Core.Implementations.RedisDatabase.<GetAsync>d__14`1.MoveNext()
1条答案
按热度按时间vkc1a9a21#
我看到代码中有几个问题:
您应该重用同一个redis客户端示例,以避免与redis服务器的tcp连接过多。
不要使用
.Result
以避免阻塞当前线程。将方法更新为异步并在getasync上使用await。确保不要将大对象存储在缓存项中(在这种情况下
List<MyObject>
不应该是一个大的列表)以下是更新的代码: