对于使用.NET的新Web应用程序项目,将在线提供现有库(使用C#编写),该库可对数据模型中的信息执行一些计算。
许多用户需要同时访问该库。每个用户都将使用不同的数据集。用户还可以修改模型数据并使用修改的输入参数重复计算。
目前,该库一次只能处理一个数据模型。 (我们假设存在静态类和单例等设计问题。)
如果.NET Web应用程序(使用HTML网页的简单Web前端)想要使用此库,是否有可用于为每个客户端创建库的单独实例的技术,以保持模型和其他参数分离?
答案 0 :(得分:1)
您可以在外部加载模块并每次创建一个新实例,或者使用.NET Enterprise Services(COM +)使用对象池,但如果该对象是有状态的,那么您仍然会遇到可伸缩性问题。
每条评论:是的,你可以。查看this example,了解快速入门。
答案 1 :(得分:1)
您可以将相关库加载到单独的AppDomains中。这样,您就可以拥有多个单例实例,每个实例都在AppDomain中隔离。
Jeffrey Richter "Using AppDomains to make Non-Threadsafe code Threadsafe"
答案 2 :(得分:0)
如果您希望用户在您的asp.net应用程序实例中共享单个对象,则需要使用线程安全性来实现任何类型的访问和修改。
您可以创建一个包装器来使用和管理库的实例。
答案 3 :(得分:0)
您可以使用锁定,例如:
lock (typeof(YOUR_MODEL_CLASS))
{
}
或尝试排队计算,将参数保存到数据库文件并运行服务并在其自己的时间内进行每次计算。
将有一个稳定/可用的阈值。
答案 4 :(得分:0)
大多数.NET Framework类都不是为多线程访问而设计的,正如您在MSDN中看到的那样。
如果你说,你的用户使用不同的数据集,那么你的程序需要为每个用户在库中创建类的实例 - 这对我来说听起来没有问题。
如果许多用户使用同一组数据,那么你将不得不关心库的多线程能力。
答案 5 :(得分:0)
如果您正在谈论在多线程环境中未设置为安全的组件,那么答案是肯定的。但是,您必须选择“同步”对组件的访问权限的机制。 C#中最简单的形式是“锁定”语法。
如果您正在谈论一次只允许单个实例的组件,那么答案就是否定。这是因为Web应用程序本质上是多线程的。在asp.net中使用它将要求您锁定整个服务器以等待组件完成,这通常是一件坏事。 我最好的解决方案是将这样的组件用于异步操作。允许用户指定输入参数,然后将此数据保存在某处并使用某种调度程序一次处理一个数据。当流程结束时,通知用户工作已完成等。
此外,当组件花费大量时间进行处理时,最好不要让用户同步地与组件进行交互。