0

可以使用外部程序集的static method,如[ThreadStatic]方法嗎?將[ThreadStatic]屬性應用於外部程序集中的方法

這是我的情況。 的assembly class(我沒有訪問到其源極)具有這種結構

public class RegistrationManager() 
{ 
    private RegistrationManager() {} 
    public static void RegisterConfiguration(int ID) {} 
    public static object DoWork() {} 
    public static void UnregisterConfiguration(int ID) {} 
} 

一旦註冊,我無法與不同的ID,而不註銷調用DoWork()先前註冊的一個。其實我想用多線程同時調用不同ID的DoWork()方法。

如果RegisterConfiguration(int ID)方法是[ThreadStatic],我可以在不同的線程中調用它,而不會出現通話問題,對吧?那麼,我可以將[ThreadStatic]屬性應用於此方法,還是有任何其他方法可以同時調用兩個static方法,而無需等待其他線程取消註冊?


如果我檢查它,如下所示,它應該工作。

for(int i=0; i < 10; i++) 
{ 
    new Thread(new ThreadStart(() => Checker(i))).Start(); 
} 

public string Checker(int i) 
{ 
    public static void RegisterConfiguration(i); // Now i cannot register second time 
    public static object DoWork(i); 
    Thread.Sleep(5000); // DoWork() may take a little while to complete before unregistered 
    public static void UnregisterConfiguration(i); 
} 

回答

2

我不知道,你可以添加[ThreadStatic]到外部組件,而無需源代碼重新編譯。

但是,您可以創建其他應用程序域,以同時執行代碼。幾乎不像線程那麼優雅,但仍然是一個潛在的解決方案。

http://msdn.microsoft.com/en-us/library/ms173139%28v=VS.100%29.aspx

取決於在其下可結合將use a tool like Reflector進行逆向工程的外部組件的源代碼和將所述[ThreadStatic]屬性許可證另一種選擇。

+0

謝謝Erik,我會嘗試使用不同的應用程序域。我發現['這個問題'](http://stackoverflow.com/questions/4298913/static-fields-in-appdomain)與此有關,但我有困惑在不同的AppDomains中調用靜態方法,讓我試試。 –

+0

對您提及的問題的接受答案應解決問題。您首先需要創建一個包裝器對象,您可以創建一個包裝器對象,並讓該包裝器對象與靜態方法進行交互。讓我知道這是如何解決的。 –

+0

我試圖使用另一個包裝庫並調用該函數,它調用該函數,但因爲它返回的是另一個對象,該對象是外部庫中不可序列化的類的實例。所以我得到了一個序列化異常。無論如何,當我們調用'appDomain1..CreateInstanceAndUnwrap(...)。FactoryMethod()'時,創建一個不可序列化的對象並從包裝器庫中返回它。 –

1

ThreadStatic適用於領域,而不是方法,所以這個想法從一開始就註定要失敗。應該可以反彙編DLL,修改源代碼並重新組合,但這是沒有意義的,因爲沒有簡單的方法可以使另一個組件成爲線程安全的。

你可能想編寫一個包裝類,如:

class RegistraionWrapper 
{ 
    private static Object _lock = new Object(); 

    public static void DoWork(int ID) 
    { 
     lock (_lock) 
     { 
      RegistrationManager.RegisterConfiguration(ID); 
      RegistrationManager.DoWork(); 
      RegistrationManager.UnregisterConfiguration(ID); 
     } 
    } 
} 

你可能需要把註銷呼叫finally塊。當然這個鎖使得產生多個線程來完成這項工作毫無意義,但目前還不清楚這個庫是否支持它。你最好的選擇是和這個圖書館的作者交談。

相關問題