Вы можете загрузить каждый поток в разные AppDomain , что даст вам различные статические методы.
Кроме того, ThreadStaticAttribute может быть полезным для вас. Не уверен, подходит ли он вам, но посмотрите.
Upd: больше информации об использовании доменов приложений. Предположим, что у вас есть сторонний класс Memory
, определенный следующим образом. (И вы не можете изменить его, и он использует внутренние статические переменные)
// Cannot be changed
public class Memory
{
static int StaticId;
public static void OpenProcess(int id)
{
StaticId = id;
}
public static int GetOpenedId()
{
return StaticId;
}
}
Вы можете написать оболочку, производную от MarshalByRefObject (это важно):
class MemoryWrap : MarshalByRefObject
{
public void OpenProcess(int id)
{
Memory.OpenProcess(id);
}
public int GetOpenedId()
{
return Memory.GetOpenedId();
}
}
Таким образом, если вы создаете экземпляры MemoryWrap
не по ключевому слову new
, а с использованием AppDomain.CreateInstanceAndUnwrap
в другом домене, каждый экземпляр будет иметь свой собственный статический контекст. Пример: * +1021 *
class Program
{
static void Main(string[] args)
{
var type = typeof(MemoryWrap);
var domain1 = AppDomain.CreateDomain("Domain 1");
var memory1 = (MemoryWrap)domain1.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
var domain2 = AppDomain.CreateDomain("Domain 2");
var memory2 = (MemoryWrap)domain2.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
memory1.OpenProcess(1);
memory2.OpenProcess(2);
Console.WriteLine(memory1.GetOpenedId());
Console.WriteLine(memory2.GetOpenedId());
Console.ReadLine();
}
}
Будет напечатано:
1
2
PS: в этом примере я не делал очистку только для удобства чтения (выгрузка доменов с помощью AppDomain.Unload()
и другие вещи). Не забудьте сделать это в своем коде. + Есть некоторый беспорядок с временем жизни объектов в другом домене, но это следующий уровень проблем)))