我可以在多用户.NET web应用程序中使用非线程安全库吗?

我可以在多用户.NET web应用程序中使用非线程安全库吗?,.net,thread-safety,.net,Thread Safety,对于使用.NET的新web应用程序项目,将在线提供一个现有库(用C#编写),该库对数据模型中的信息执行一些计算 该库需要多个用户同时访问。每个用户将使用不同的数据集。用户还可以修改模型数据,并使用修改后的输入参数重复计算 目前,该库一次只能处理一个数据模型。(假设存在静态类和单例等设计问题) 如果.NET web应用程序(使用HTML网页的简单web前端)希望使用此库,是否有一种技术可用于为每个客户端创建库的单独实例,要将模型和其他参数分开?您可以从外部加载模块,每次都创建一个新实例,或者使用(

对于使用.NET的新web应用程序项目,将在线提供一个现有库(用C#编写),该库对数据模型中的信息执行一些计算

该库需要多个用户同时访问。每个用户将使用不同的数据集。用户还可以修改模型数据,并使用修改后的输入参数重复计算


目前,该库一次只能处理一个数据模型。(假设存在静态类和单例等设计问题)


如果.NET web应用程序(使用HTML网页的简单web前端)希望使用此库,是否有一种技术可用于为每个客户端创建库的单独实例,要将模型和其他参数分开?

您可以从外部加载模块,每次都创建一个新实例,或者使用(COM+)使用对象池,但是如果对象是有状态的,您仍然会遇到可伸缩性问题


每个评论:是的,你可以。查看快速入门。

若您希望用户在asp.net应用程序实例中共享一个单例对象,那个么对于任何类型的访问和修改,都需要使用线程安全性来实现它


您可以创建用于使用和管理库实例的包装器。

您可以使用锁定,例如:

lock (typeof(YOUR_MODEL_CLASS))
{
}
或者尝试并排队计算,将参数保存到数据库文件中,让服务运行并在自己的时间内执行每个计算


这将有一个稳定/可用的阈值。

大多数.NET Framework类都不是为多线程访问而设计的,正如您在MSDN中看到的那样

如果您说,您的用户使用不同的数据集,那么您的程序需要为每个用户在库中创建类的实例——这听起来没有问题


如果许多用户使用同一组数据,那么您就必须关心库的多线程能力。如果您谈论的组件在多线程环境中设置不安全,那么答案是肯定的。但是,必须选择“同步”组件访问的机制。C#中最简单的形式是“锁”语法


如果您谈论的组件只允许一次使用一个实例,那么答案是否定的。这是因为web应用程序本质上是多线程的。在asp.net中使用它需要锁定整个服务器,直到组件完成,这通常是一件坏事。 对此,我的最佳解决方案是将此类组件的使用作为异步操作。允许用户指定输入参数,然后将此数据保存在某个位置,并使用某种调度器一次处理一个数据。流程完成后,通知用户工作已完成等


此外,当组件需要花费大量时间处理时,最好不要让用户与组件同步交互。

您可以将相关库加载到单独的AppDomain中。这样,您就可以有多个单例实例,每个实例都隔离在一个AppDomain中


您的用户需要同时处理不同的模型数据,但您的库一次只能处理一个模型数据?您所说的意思是这是不可能的,那个库中只有静态类吗?我们谈论的是什么库?假设存在一些设计问题,如静态类或单例,这些问题无法足够快地解决。加载模型可能需要一分钟,完成后,用户需要以交互方式使用模型。排队/负载平衡是一个好主意,但在这种情况下,在客户端请求和数据集之间切换会花费很多时间。非常感谢链接,COM+对象池是一个非常有趣的选择。您知道我是否可以在ASP.NET应用程序中使用COM+对象池吗?库当前说“将我的对象池视为一个单独的对象”,但web应用程序希望创建具有不同状态的多个实例。基本问题是如何创建库的多个实例,并将web客户端会话绑定到一个库实例。假设存在一些设计问题,如静态类或单例,这些问题无法快速解决,因此,无法为每个用户创建数据模型实例。这正是我所担心的答案:)异步处理的优点是正确的,但这只是第一次初始化,需要一些时间,然后与加载的数据模型的交互很快。如果一次只能为整个web应用程序加载一个模型,那么如果许多用户必须在模型之间切换,那么问题就会出现,这会一直导致初始化。将会话绑定到库实例,或向库中添加多用户功能是选项。你知道我是否可以在ASP.NET应用程序中使用COM+对象池吗?你可以。但我不确定COM+是否能解决任何问题,除非您能为每个模型创建一个单独的池,因为真正的问题是模型加载时间。如果我没记错的话,COM+池实例中没有任何状态,因此这可能无法实现。