gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:03 26 4
gpt4 key购买 nike

我正在使用一个库,该库是为根据输入数据执行模拟而创建的,具有单个入口点,类似于 Run(Data data)

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

我想同时运行多个模拟的原因是让用户能够指定一个范围的值,并让他们的所有输出聚合并以可比较的格式呈现。

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

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

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

有没有办法指定程序集/静态类声明,而不修改它,以使用本地线程存储?或者也许是一种在运行时甚至有效地创建对同一程序集的多个引用的方法?

最佳答案

您使用单独的控制台应用程序是正确的,但由于启动成本如此之高,您需要更复杂的方法。

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

您也可以通过将库多次加载到单独的 AppDomain 中来在内存中做同样的事情,但我个人认为单独的进程更容易和更安全。

关于C# 外部库使用静态成员防止多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17460542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com