将[ThreadStatic]属性应用于外部程序集中的方法

时间:2013-10-28 15:52:37

标签: c# multithreading thread-safety static-methods threadstatic

我可以使用外部程序集的static method方法[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。实际上我想用多线程同时使用不同的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 个答案:

答案 0 :(得分:2)

我不知道您可以将[ThreadStatic]添加到外部程序集,而无需重新编译它的源代码。

但是,您可以创建其他应用程序域,以便同时执行代码。不像线程那样优雅,但仍然是一个潜在的解决方案。

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

根据您可能受限制的许可证的另一个选项是use a tool like Reflector对外部程序集的源代码进行反向工程并添加[ThreadStatic]属性。

答案 1 :(得分: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);
        }
    }
}

您可能需要将Unregister调用放在finally块中。当然,锁定使得生成多个线程来完成工作毫无意义,但是这个库根本不支持它。你最好的选择是与这个图书馆的作者交谈。