Closed CodingdAwn closed 1 year ago
实际上我看项目中的LockTest.cs中也是使用Task.run做测试的,只是数量比较少 var tasks = new Task[4]; for (var a = 0; a < tasks.Length; a++) tasks[a] = Task.Run(() => { var lk = cli.Lock("testlock1", 10); Thread.CurrentThread.Join(1000); Assert.True(lk.Unlock()); }); Task.WaitAll(tasks);
测试代码: using FreeRedis;
class Program { static Lazy _cliLazy = new Lazy(() =>
{
var r = new RedisClient("127.0.0.1:6379,database=10"); //redis 3.2
return r;
});
public static RedisClient cli => _cliLazy.Value;
}
同步运行的话 Set和Lock都没有问题 但是异步使用task.run执行的话(即使数量比较少的情况下也会出问题) set和lock都会出现连接redis-server timeout的错误
错误log: ---> (Inner Exception #989) System.Exception: 【127.0.0.1:6379/10】状态不可用,等待后台检查程序恢复方可使用。Connect to redis-server(127.0.0.1:6379) timeout ---> System.TimeoutException: Connect to redis-server(127.0.0.1:6379) timeout at FreeRedis.Internal.DefaultRedisSocket.Connect() at FreeRedis.Internal.DefaultRedisSocket.Write(CommandPacket cmd) at FreeRedis.RedisClient.SingleInsideAdapter.<>cDisplayClass5_0b 0()
at FreeRedis.RedisClient.LogCallCtrl[T](CommandPacket cmd, Func
1.<AdapterCall>b__0() at FreeRedis.RedisClient.LogCallCtrl[T](CommandPacket cmd, Func
1 func, Boolean aopBefore, Boolean aopAfter) at FreeRedis.RedisClient.LogCall[T](CommandPacket cmd, Func1 func) at FreeRedis.RedisClient.SingleInsideAdapter.AdapterCall[TValue](CommandPacket cmd, Func
2 parse) at FreeRedis.RedisClient.Call[TValue](CommandPacket cmd, Func2 parse) at FreeRedis.RedisClient.Ping(String message) at FreeRedis.Internal.RedisClientPoolPolicy.PrevReheatConnectionPool(ObjectPool
1 pool, Int32 minPoolSize) --- End of inner exception stack trace --- at FreeRedis.Internal.ObjectPool.ObjectPool1.GetFree(Boolean checkAvailable) at FreeRedis.Internal.ObjectPool.ObjectPool
1.Get(Nullable1 timeout) at FreeRedis.RedisClient.PoolingAdapter.GetRedisSocket(CommandPacket cmd) at FreeRedis.RedisClient.PoolingAdapter.<>c__DisplayClass9_0
1.1 func, Boolean aopBefore, Boolean aopAfter) at FreeRedis.RedisClient.LogCall[T](CommandPacket cmd, Func
1 func) at FreeRedis.RedisClient.PoolingAdapter.AdapterCall[TValue](CommandPacket cmd, Func2 parse) at FreeRedis.RedisClient.Call[TValue](CommandPacket cmd, Func
2 parse) at FreeRedis.RedisClient.Set[T](String key, T value, TimeSpan timeout, Boolean keepTtl, Boolean nx, Boolean xx, Boolean get) at FreeRedis.RedisClient.SetNx[T](String key, T value, Int32 timeoutSeconds)也是第一次使用c#做项目,这里是我使用的错误么,不应该使用task.run去异步执行redis的操作么