【发布时间】:2017-12-17 13:34:40
【问题描述】:
我有一个由 IIS Express 提供的 ASP.Net WebAPI (MVC),它使用外部 dll 库。 不幸的是,这个库被构建为只有一个客户端,这意味着它有一个静态变量“客户端”,它可以在任何地方使用。
因此,如果我有很多客户端,对于每个请求,我都必须将此静态变量切换到发出请求的客户端。 问题是这样,我需要“锁定”变量,因此不允许其他客户端请求。
我不知道 IIS 使用线程池管理其线程的确切方式,但我认为它应该类似于每个请求一个线程。因此,将这个“Client”变量放入 ThreadStatic 可以完成这项工作,因为它的值对于每个线程都是不同的,但是由于“Client”用于库的实习线程,它应该会产生很多错误。
为了更准确地解释我想要什么,请考虑这种情况:
你有一段这样的代码,代表我的图书馆:
class Client {
void doSomething() {}
void blabla() {}
}
static Client c;
... Code here, probably involving c in threads ...
public void function() {
c.blabla();
}
在我的应用程序中,我有多个线程想要同时调用 doSomething() 和 function()。所以他们需要“欺骗”编译器来创建一个局部变量并将其放入'c'变量中。 希望对您有所帮助。
【问题讨论】:
-
您必须修改 DLL 的 IL 以添加该属性,以便 JITter 在编译代码时知道该做什么。事后您将无法更改变量的性质。 “不幸的是,这个库是为只有一个客户端而构建的……我有很多客户端”——这是你的问题。使用不同的库,甚至自己重新实现功能。您使用的库不是为支持您的方案而构建的。
-
如果你真的必须使用这个库,一个选项可能是为每个客户端创建一个 AppDomain。这是非常重量级的;它只会扩展到目前为止,如果“许多客户”意味着 100 或更多,我怀疑它会起作用。我猜你可能会在打到 12 个或 2 个标记时开始遇到麻烦。
-
其实这个库大约有 1M 行,而且很专业(我的工作是为他们创建一个 Web 界面)。我已经考虑过 AppDomain,正如您所提到的,仅在 30 或 40 个客户端之后它需要的内存是不可能的。
-
“我的工作是为他们创建一个 Web 界面” -- 如果他们是您的客户,您应该与他们合作解决这个限制。您的问题中没有足够的上下文来了解具体需要更改的内容,但他们是将您画到角落的人。他们应该帮助你退出。除此之外,也许不是 AppDomains,而是每个客户端只运行一个进程;从理论上讲,这应该比 AppDomains更糟,但您可能会避免一些编组开销,并且 Windows 可能会比 .NET 更好地划分工作。只是一个想法,可能一文不值。
-
这不是我的客户,我在公司工作!我知道这个库的代码,我可以修改它。但是在这个字段上放置一个 ThreadStatic 将是灾难性的,因为它通过代码在许多线程中使用。而且我不想仅仅为了一个网络界面而改变一个如此重要的领域。我试试进程分离。
标签: c# asp.net threadpool