C#外部库使用静态成员阻止多线程

时间:2013-07-04 01:22:12

标签: c# .net multithreading static-libraries .net-4.5

我正在使用创建的库来执行基于输入数据的模拟,只有一个入口点,如Run(Data data)

但遗憾的是,库内部将值存储为静态成员(我不知道为什么,但我无法更改),以便在多个线程影响到多个线程的同时尝试执行多个模拟时出现问题内部相同的数据。

我想同时运行多个模拟的原因是让用户能够指定一系列值并拥有所有输出聚合并以可比较的格式显示。

最初我认为解决这个问题的最简单方法是编写一个简单的控制台应用程序,它可以作为一个单独的进程生成,以执行计算并转储结果。然而,需要将大量数据加载到内存中以便运行模拟并产生单独的进程意味着需要多次加载此数据并且比顺序运行模拟要慢得多,并且可能会耗费几千兆字节。记忆。

所以基本上我正在寻找一种为每个线程创建本地存储的方法,如果我可以修改库,我会看到这样的代码:

[ThreadStatic]
public static int Foo { get; set; }

有没有办法在不修改它的情况下指定汇编/静态类声明来使用本地线程存储?或者甚至可以在运行时有效地创建对同一程序集的多个引用?

1 个答案:

答案 0 :(得分:1)

您使用单独的控制台应用程序走在正确的轨道上,但由于启动成本太高,您需要更复杂的方法。

不是每次都生成一个新的控制台应用程序,而是创建一个可以与之通信的子进程池(通过stdin / stdout或其他一些进程间通信,如wcf,远程处理或命名管道)。创建一个包装器/管理器类,它跟踪这些进程,根据需要生成新进程,并知道正在使用哪些进程。当一个进程未被使用时,它可以向它发送一个新的调用并等待结果。

您还可以通过将库多次加载到单独的AppDomain中来在内存中执行相同的操作,但我个人认为单独的过程更容易,更安全。