Вы должны использовать ConcurrentStack
в вашем случае.
Если вы не можете использовать ConcurrentStack
- вы можете использовать Stack.Synchronized()
метод:
Stack mySynchronizedStack = Stack.Synchronized(myStack);
Но даже если вы используете Synchronized()
перечисления методов по-прежнему не безопасны для потоков, вам следует использовать блокировку для перечисления вашего стека.
Stack myStack = new Stack();
lock (myStack.SyncRoot)
{
foreach (var element in myStack)
{
}
}
К сожалению, но общая версия Stack
не имеет метода Synchonization()
.
Итак, ваш код должен быть:
public static class StackManager
{
private static Stack ParameterStack;
static StackManager()
{
ParameterStack = Stack.Synchronized(new Stack());
}
public static T Pop<T>()
{
object RawObject = ParameterStack.Pop();
return RawObject is T ? (T)RawObject : default(T);
}
public static void Push<T>(T Data)
{
ParameterStack.Push(Data);
}
}
Вы также должны использовать object
type для RawObject
, если хотите проверить тип. В вашем коде вы получите исключение, если попытаетесь Pop
объект другого типа.