imperugo / StackExchange.Redis.Extensions

MIT License
600 stars 179 forks source link

Redis cache InvalidOperationException: Reading is not allowed after reader was completed #342

Open ashuthinks opened 3 years ago

ashuthinks commented 3 years ago

I have one webjob that is continously inserting data into redis I have another time trigger function to read data from the same redis cache after every 5 minutes.

  // redis cache
    public static NewtonsoftSerializer newSerializer = new NewtonsoftSerializer();
    public static SinglePoolRedisCacheConnectionPoolManager newSpRedisCacheConnectionPoolMgr = new SinglePoolRedisCacheConnectionPoolManager(ConfigurationManager.AppSettings["redisConnectionString"]);
    public static RedisConfiguration newRedisConfiguration = new RedisConfiguration();
    public static IRedisDatabase newCacheclient = new RedisCacheClient(newSpRedisCacheConnectionPoolMgr, newSerializer, newRedisConfiguration).Db0;

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;

after executing 10-15minutes I'm getting below error from time trigger function .anyone know how to tackle this?

InvalidOperationException: Reading is not allowed after reader was completed.

nuget version details - https://i.stack.imgur.com/LWSss.png

Error Stack - Inner Exception 1:

InvalidOperationException: Reading is not allowed after reader was completed.

at System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification) at MyData.Functions.ExecuteTrade(TimerInfo myTimer) in C:\Users\\Functions.cs:line 27 at Microsoft.Azure.WebJobs.Host.Executors.VoidMethodInvoker1.InvokeAsync(TReflected instance, Object[] arguments) at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`1.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.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.d__14`1.MoveNext()

lookingcloudy commented 5 months ago

Seems to be a common error.

imperugo commented 5 months ago

Hi @ashuthinks

first of all thanks for using the library. Looking at your code I see different things that are not correct:

This is wrong

var cachedData = newCacheclient.GetAsync<List<MyObject>>("mydata").Result;

use the async method instead or, if you can't use the async method, please use this approach

var cachedData = newCacheclient.GetAsync<List<MyObject>>("mydata").GetAwaiter().GetResult();

Moreover, the library you are using is very old. You are using the 6.3.5 that was released on 9/1/2020 now we are on 10.2.0, so please update to the latest version.

@lookingcloudy what do you mean with "Seems to be a common error." ? Do you have the same issue?