0

我可以使用外部程序集的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) {}
}

DoWork()注册后,如果不取消注册之前注册的 ID ,我就无法使用其他 ID 拨打电话。实际上,我想DoWork()通过多线程同时调用具有不同 ID 的方法。

如果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);
}
4

2 回答 2

2

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

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

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

根据您可能绑定的许可证,另一个选项是使用反射器之类的工具对外部程序集的源代码进行逆向工程并添加[ThreadStatic]属性。

于 2013-10-28T15:55:58.240 回答
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 块中。当然,锁使得生成多个线程来完成工作变得毫无意义,但不清楚这个库是否支持这一点。你最好的选择是与这个库的作者交谈。

于 2013-10-28T21:51:26.633 回答