【问题标题】:Use DLL static variable in different threads在不同的线程中使用 DLL 静态变量
【发布时间】: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


【解决方案1】:

经过数小时的研究,我得出结论,唯一(也是合乎逻辑的)方法是创建 AppDomain 或单独的进程。 我可能会遵循@OlehNechytailo 的建议。

【讨论】:

    【解决方案2】:

    (根据第一条评论改变答案)

    我只会锁定所有访问权限,一次只做一件事。

    如果这还不够好,我认为它已经足够好了。

    然后我会看看我是否可以排队工作。

    然后我会研究反射System.Reflection.LoadAssembly,但在阅读Best Practices for Assembly Loading(从 2017 年 3 月 30 日开始)之后。 :)

    【讨论】:

    • 因为我的库不使用您创建的方法“GetClient()”,它在任何地方都使用“客户端”,并且客户端是在库中初始化的某个地方创建的,所以我不能(或正是我不想)修改它。
    • 啊。我现在明白了。
    • 哈哈,这还不够好;)我的请求要求进行大量数据处理,这大约需要 4 或 5 秒。所以想象一下,如果我同时有 100 个客户......我来看看 Reflection,看起来很有趣。
    • 1.你会有100个客户吗? 2. 可以排队吗?
    • 1.绝对有可能。 2.排队?我可以,但会导致漫长的等待......
    猜你喜欢
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多