Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不同的线程中使用DLL静态变量_C#_Asp.net_Threadpool - Fatal编程技术网

C# 在不同的线程中使用DLL静态变量

C# 在不同的线程中使用DLL静态变量,c#,asp.net,threadpool,C#,Asp.net,Threadpool,我有一个ASP.NETWebAPI(MVC),由使用外部dll库的IIS Express提供服务。 不幸的是,这个库只构建了一个客户机,这意味着它有一个在任何地方都使用的静态变量“client” 因此,如果我有许多客户机,对于每个请求,我必须将这个静态变量切换到执行请求的客户机。 问题是这样,我需要“锁定”变量,因此不允许其他客户端请求 我不知道IIS使用线程池管理线程的确切方式,但我认为应该是每个请求一个线程。因此,将这个“Client”变量放入ThreadStatic可以完成这项工作,因为它

我有一个ASP.NETWebAPI(MVC),由使用外部dll库的IIS Express提供服务。 不幸的是,这个库只构建了一个客户机,这意味着它有一个在任何地方都使用的静态变量“client”

因此,如果我有许多客户机,对于每个请求,我必须将这个静态变量切换到执行请求的客户机。 问题是这样,我需要“锁定”变量,因此不允许其他客户端请求

我不知道IIS使用线程池管理线程的确切方式,但我认为应该是每个请求一个线程。因此,将这个“Client”变量放入ThreadStatic可以完成这项工作,因为它的值对于每个线程都是不同的,但是由于“Client”在库的intern线程中使用,它应该会产生很多bug

为了更准确地解释我想要什么,考虑一下这种情况:

您有这样一段代码,它表示我的库:

class Client {
     void doSomething() {}
     void blabla() {}
}

static Client c;

... Code here, probably involving c in threads ...

public void function() {
     c.blabla();
}
在我的应用程序中,有多个线程希望同时调用doSomething()和function()。因此,他们需要“欺骗”编译器创建一个局部变量并将其放入“c”变量中。 希望有帮助。

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

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

如果这还不够好,我会说这已经足够好了

然后我会看看我是否能把工作排成队


然后我会研究反射
系统.reflection.LoadAssembly
,但在阅读之后(2017-03-30)。)

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

您必须修改DLL的IL以添加属性,这样当JITter编译代码时,它就知道该怎么做了。你不能在事后改变变量的性质。“不幸的是,这个库只有一个客户机……我有很多客户机”——这就是你的问题。使用不同的库,甚至自己重新实现功能。您正在使用的库不是为支持您的方案而生成的。如果您确实必须使用此库,一个选项可能是为每个客户端创建一个AppDomain。这是非常重的,虽然;它只能扩展到目前为止,如果“许多客户”意味着100个或更多,我怀疑它是否有效。我猜,你可能会在十几行或两行的时候遇到麻烦。实际上,这个库大约有一百万行,而且是专业的(我的工作是为它们创建一个web界面)。我已经考虑过AppDomains,正如您所提到的,在30或40个客户端之后,它所需的内存是不可能的。“我的工作是为它们创建一个web界面”——如果它们是您的客户端,您应该与它们合作以解决限制。在你的问题中没有足够的上下文来知道具体需要改变什么,但正是他们把你逼到了墙角。他们应该帮你摆脱困境。除此之外,可能不是AppDomains,而是每个客户端运行一个进程;从理论上讲,这应该比AppDomains更糟糕,但您可能会避免一些封送处理开销,而且Windows在分区工作方面可能比.NET做得更好。只是一个想法,可能一文不值。这不是我的客户,我在公司工作!我知道这个库的代码,我可以修改它。但是将ThreadStatic放在这个字段上将是灾难性的,因为它通过代码在许多线程中使用。我不想仅仅为了一个web界面而改变一个如此重要的领域。我将尝试进程分离。因为我的库不使用您创建的方法“GetClient()”,所以它在任何地方都使用“Client”,并且客户端是在库中初始化时创建的,所以我不能(或者确切地说我不想)修改它。啊。我现在明白了。哈哈,这还不够好;)我的请求要求进行大量的数据处理,大约需要4到5秒钟。想象一下如果我同时有100个客户。。。我来看看倒影,看起来很有趣。你会有100个客户吗?2.你能排队吗。绝对有可能。2.队列我可以,但这会导致长时间的等待。。。