c# - 如何使我的 appDomain 生命周期更长?

标签 c# .net architecture appfabric

这是我们所处的情况。

我们正在将我们的程序集(纯 DLL)分发给我们的客户(我们无法控制他们的环境)。

他们通过传递项目 ID 列表来调用我们,我们搜索庞大的数据库并返回价格最高的项目。由于我们要满足 SLA(30 毫秒),我们将我们的项目缓存在内存缓存中(使用 Microsoft MemoryCache )我们正在缓存大约一百万个项目。

这里的问题是,它只在我们的客户端应用程序生命周期内缓存。当进程退出时,所有缓存的项目也会退出。

有没有办法让我的内存缓存生命周期更长,以便后续进程可以重用缓存项?

我考虑过使用窗口服务并允许所有这些不同的进程在同一个盒子上与一个进程通信,但这会在部署时造成巨大的困惑。

我们使用 AppFabric 作为分布式缓存,但实现 SLA 的唯一方法是使用内存缓存。

如有任何帮助,我们将不胜感激。谢谢

最佳答案

我看不出有什么方法可以确保您的 AppDomain 生命周期更长——因为调用程序集所要做的就是卸载 AppDomain...

一个选项可能是——尽管也很困惑——实现某种“持久内存缓存”……为了实现性能,你可以/将使用 ConcurrentDictionary坚持 MemoryMappedFile ...

另一种选择是使用本地数据库——甚至可以是 Sqlite并实现内存中的缓存接口(interface),以便所有写入/更新/删除都是“直写”,而读取是纯 RAM 访问...

另一种选择可能是包含一个 EXE(例如作为嵌入式资源),如果它没有运行,则从 DLL 内部启动它...EXE 提供 MemoryCache,通信可以通过IPC(例如共享内存...)。由于 EXE 是一个单独的进程,即使在卸载您的 AppDomain 后它仍会保持事件状态...问题在于客户端是否喜欢和/或权限是否允许...

我真的很喜欢 Windows 服务方法,尽管我同意这可能是一个部署困惑...

关于c# - 如何使我的 appDomain 生命周期更长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6837993/

相关文章:

c# - 我应该如何构建我的领域模型

Java - 使用泛型或继承

c# - 从触发器启动对话框

c# - 关于在 Blazor 中使用 ValueTask 的 CA2012 警告。如何在 Blazor 中正确实现 "fire and forget"?

c# - 有没有办法以编程方式最小化窗口

C# 获取调用程序集的父程序集名称

java - 后端服务器脚本

c# - 如何强制将焦点放在 Windows 窗体中的控件上

c# - __doPostBack 未在 JavaScript 中定义

c# - AggregateException.Flatten() 丢失堆栈跟踪信息。丢失的信息重要还是不重要?