【问题标题】:C# Azure Redis Cache - Cannot access a disposed object exceptionC# Azure Redis 缓存 - 无法访问已处置的对象异常
【发布时间】:2019-01-28 05:23:53
【问题描述】:

按照以下链接在 Web API 中实现 Redis 缓存。 https://docs.microsoft.com/en-us/azure/redis-cache/cache-dotnet-how-to-use-azure-redis-cache

缓存第一次正常工作,但失败并出现错误

“无法访问已处置的对象”

...关于后续读取。

正如上面博客中提到的,我在方法结束时处理连接并再次调用该方法抛出上述异常: lazyConnection.Value.Dispose();

还尝试将连接属性封装在不同的类中,如此处所述。但由于它们被声明为静态,相同的值会在所有实例中保留,因此在处理连接时会在后续调用中导致相同的异常。

https://www.c-sharpcorner.com/article/using-redis-cache-in-web-api/

有几种方法可以解决这个问题:

  1. 不要释放连接并为所有调用重复使用相同的连接。

  2. 使缓存连接为非静态连接,以便为每次调用创建和释放一个新连接。

这样做的正确方法是什么?

【问题讨论】:

  • StackExchange.Redis 的文档说 "请注意,ConnectionMultiplexer 实现了 IDisposable,并且可以在不再需要时释放。这个minimal reproducible example 故意不显示 using 语句的用法,因为 它非常罕见的是,您想简单地使用 ConnectionMultiplexer,因为它的想法是重复使用此对象。"

标签: c# azure caching redis stackexchange.redis


【解决方案1】:

您不应该在每次调用时都创建连接,那样会非常低效。 如果可能,还应避免静态连接。它可以使单元测试更难编写,并防止您在同一进程中拥有多个连接。

【讨论】:

  • 好的,你有什么建议?
  • 在您发布链接的示例代码中,我只需从私有连接变量中删除静态关键字,并使连接成为我将使用实例构造的封闭对象的非静态成员构造函数。我将向封闭类添加一个 Dispose 方法,并让该方法在连接实例上调用 Dispose。
猜你喜欢
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多