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块。当然这个锁使得产生多个线程来完成这项工作毫无意义,但目前还不清楚这个库是否支持它。你最好的选择是和这个图书馆的作者交谈。

相关问题