我可以使用外部程序集的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);
}
答案 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块中。当然,锁定使得生成多个线程来完成工作毫无意义,但是这个库根本不支持它。你最好的选择是与这个图书馆的作者交谈。