- Регистрация
- 09.10.2015
- Сообщения
- 3 916
- Благодарностей
- 3 867
- Баллы
- 113
Нашел немного времени и решил допилить свою либу ProfileActions для работы с профилем ZP, а именно - добавить туда сохранение своих данных в профиль. Но каким-то образом споткнулся на странное и непонятное мне поведение, поэтому прошу помощи у знающих, чтобы сильно не переделывать логику работы.
Суть в том, что при работе с:
почему-то данные внутри переменной variables пересекаются между потоками, даже последовательными, а не только параллельными (к слову, с Dictionary<string, string> всё на 100% окей).
Привожу отрывок кода, который воспроизводит эту ситуацию:
Вызов этого, соответственно, из шаблона:
И вот что получается при последовательном выполнении (1 поток):
То есть проблема будет даже в том, что если в 1 шаблоне мы начали "следить" за переменной и добавили её в List, то совсем в другом шаблоне у нас вывалится ошибка при сохранении (этот код я не приводил, чтоб не путать), т.к. в другом шаблоне почему-то тоже окажется, что мы следим за этой переменной.
Почему так происходит?
Где я накосячил?
Суть в том, что при работе с:
C#:
[ThreadStatic] private static List<string> variables = null;
Привожу отрывок кода, который воспроизводит эту ситуацию:
C#:
namespace ZPProfileActions
{
public static class ProfileActions
{
[ThreadStatic] private static List<string> variables = null;
private static void InitVariables() {
if (ProfileActions.variables == null) {
ProfileActions.variables = new List<string>();
}
}
public static void SpyVariable(IZennoPosterProjectModel project, string varname) {
ProfileActions.InitVariables();
project.SendInfoToLog("Vars: " + String.Join(",", ProfileActions.variables.ToArray()), true);
if (!ProfileActions.variables.Contains(varname)) {
ProfileActions.variables.Add(varname);
} else {
throw new Exception(String.Format(
"[ProfileActions.SpyVariable]: already spying on variable '{0}'!",
varname
));
}
}
}
}
C#:
ProfileActions.SpyVariable(project, "test_var");
То есть проблема будет даже в том, что если в 1 шаблоне мы начали "следить" за переменной и добавили её в List, то совсем в другом шаблоне у нас вывалится ошибка при сохранении (этот код я не приводил, чтоб не путать), т.к. в другом шаблоне почему-то тоже окажется, что мы следим за этой переменной.
Почему так происходит?
Где я накосячил?