簡體   English   中英

C#使用靜態成員的外部庫防止多線程

[英]C# External library using static members preventing multithreading

我正在使用一個庫,該庫是根據輸入數據和單個入口點(例如Run(Data data)基於輸入數據執行模擬的。

但是不幸的是,該庫在內部將值存儲為靜態成員(我不知道為什么,但是我不能更改它),以便在嘗試同時執行多個模擬時出現問題,因為多個線程在內部影響同一數據。

我想同時運行多個模擬的原因是使用戶能夠指定一個值范圍,並使所有輸出匯總並以可比較的格式顯示。

最初,我認為解決此問題的最簡單方法是編寫一個簡單的控制台應用程序,該應用程序可以作為單獨的進程生成,以執行計算和轉儲結果。 但是,要運行模擬並生成單獨的進程,需要將大量數據加載到內存中,這意味着該數據需要多次加載,並且比順序運行模擬要慢得多,並且可能占用數千兆字節的記憶。

因此,基本上,我正在尋找一種為每個線程創建本地存儲的方法,如果我可以修改該庫,那么我將查看如下代碼:

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

有沒有一種方法可以指定程序集/靜態類聲明,而無需對其進行修改,以使用本地線程存儲? 還是一種甚至可以在運行時高效地創建對同一程序集的多個引用的方法?

您使用單獨的控制台應用程序在正確的軌道上,但是由於啟動成本很高,因此您需要一種更復雜的方法。

與其每次都生成一個新的控制台應用程序,不如創建一個您可以與之通信的子進程池(通過stdin / stdout或其他一些進程間通信,例如wcf,遠程處理或命名管道)。 創建一個包裝器/管理器類,以跟蹤這些進程,根據需要生成新的進程,並知道正在使用哪些進程。 當一個進程不使用時,它可以向它發送一個新的調用並等待結果。

通過將庫多次加載到單獨的AppDomain中,您也可以在內存中執行相同的操作,但是我個人認為單獨的過程更容易,更安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM