我有一个由IIS Express提供的ASP.Net WebAPI(MVC),它使用外部dll库。 遗憾的是,这个库只有一个客户端,这意味着它有一个静态变量" Client"它无处不在。
因此,如果我有许多客户端,对于每个请求,我必须将此静态变量切换到执行请求的客户端。 问题是这样,我需要锁定"变量,因此不允许其他客户请求。
我完全不知道IIS使用线程池管理其线程的方式,但我认为它应该像每个请求一个线程。所以把这个"客户"变量到ThreadStatic可以完成这项工作,因为每个线程的值都不同,但是因为"客户端"在库的内部线程中使用,它应该会产生很多错误。
为了更准确地解释我想要的东西,请考虑以下情况:
你有一段代码,代表我的库:
class Client {
void doSomething() {}
void blabla() {}
}
static Client c;
... Code here, probably involving c in threads ...
public void function() {
c.blabla();
}
在我的应用程序中,我有多个线程想要同时调用doSomething()和function()。所以他们需要"欺骗"编译器创建一个局部变量并将其放入' c'变量。 希望它有所帮助。
答案 0 :(得分:0)
(根据第一条评论改变了答案)
我会锁定所有访问权限并一次执行一项操作。
如果这还不够好,我认为它已经足够好了。
然后我会看看我是否可以排队工作。
然后我会查看反思System.Reflection.LoadAssembly
,但在阅读Best Practices for Assembly Loading后(2017-03-30)。 :)
答案 1 :(得分:0)
经过数小时的研究,我得出结论,唯一(和逻辑)的方法是创建AppDomain或单独的进程。 我也许会按照@OlehNechytailo的建议。