если у меня static список в общем коде (без привязки к файлу), например, public static List<string> spisok = new List<string>(); надо ли лочить при записи в него?
Тут так же всё зависит от того, что там.
Если это справочная информация, для рандом имён и т.д. то нет, а если так как я указывал выше, то нужно лочить.
То есть если список неизменяемый, то лок в принципе не нужен. А если список изменяется то лучше лочить.
Да и чтобы не было ошибки, когда один поток открыл файл, а у другого нет доступа, то лучше лочить. Как минимум при чтении/сохранении файла желательно лочить.
И как по твоему, есть ли вообще смысл их использовать вместо использования IZennoList (только при завершении перекидывая всё в файл на пк)
Тут всё зависит от самого шаблона, и от знаний кода.
Если шаблон на пару кубиков, то можно конечно оставить и IZennoList, а если большая часть шаблонов пишете на C#, то лучше использовать C# конструкции как new List<string>.
А вот по поводу статического списка, чем раньше откажетесь тем лучше.
Я создавал по статике тему и на форуме, и списывался с разрабами.
Статика в ZennoPoster немного работает не так как в обычном приложении на C#.
Допустим вы создали статический список
public static List<string> spisok = new List<string>();
Вы писали про сохранение в конце шаблона в файл, то есть давайте представим и в начале вы читаете этот файл в spisok.
При запуске 1-го потока шаблона
1) создаёт новый список spisok.
2) Вы добавляете в него какие-то данные. (чтение файла)
3) Что-то делаете с этим списком.
Затем запускается второй поток а для него уже существует этот список так как его создал первый поток, и статические объекты распространяются на все потоки этого шаблона.
Но в вашем коде 2-й поток
опять
1) создаёт новый список spisok.
2) Вы добавляете в него какие-то данные. (чтение файла)
3) Что-то делаете с этим списком.
То есть будут выполняться одни и теже манипуляции, и если первый поток попытается взять строку из списка, в то время когда второй уже создал новый список, но ещё не добавил в него данные, то вы получите ошибку.
Короче статик список придётся лочить всегда.
Но если у вас будет обычный список (без статик)
public List<string> spisok = new List<string>();
То будет создаваться свой список внутри потока, который не нужно лочить, так как его другие потоки не видят.
Будет в каждом потоке свой уникальный список.
А если static то нужно менять логику шаблона.
Опять же не знаю для чего это список.
Но представим что этот список proxy, и работает так:
1) Создали новый список spisok.
2) Прочитали файл (proxy.txt) в spisok
3) Взяли первую строку из списка
4) Удалили эту первую строку
5) Записали эту строку в конец списка
6) Сохранили изменения в файл.
Как минимум, чтобы не пересоздавать этот список в каждом потоке, его можно проверять на null, и только потом создавать.
public class YourCode
{
public static List<string> spisok; // БЕЗ new List<string>
public static object lockSpisok = new object();
}
// Путь к файлу который нужно читать в список
string pathFile = @"C:\papka\proxy.txt";
// Переменная под прокси
string proxy = "";
lock (YourCode.lockSpisok)
{
// Если список не существует то создадим его.
if (YourCode.spisok == null)
{
// Создадим список
YourCode.spisok = new List<string>();
// И добавим в него данные из файла.
YourCode.spisok = File.ReadAllLines(pathFile).ToList();
// Удалить дубли
YourCode.spisok = YourCode.spisok.Distinct().ToList();
// Удалить пробельные символы
YourCode.spisok.RemoveAll(x => string.IsNullOrWhiteSpace(x));
}
// Взять первую строку
proxy = YourCode.spisok[0];
// Удалить первую строку
YourCode.spisok.RemoveAt(0);
// Добавить взятую строку в конец файла.
YourCode.spisok.Add(proxy);
}
// Установить proxy
instance.SetProxy(proxy);
А если это всё связано именно с одиночным получением данных (как на примере с прокси) то этот список вообще не нужен.
Можно создать метод в общем коде для получения строки
public class YourCode
{
private static object lockFileProxy = new object();
public static string GetProxy(string pathFile)
{
string proxy = "";
lock (lockFileProxy)
{
// Читаем файл
var list = File.ReadAllLines(pathFile).ToList();
// Удалить дубли
list = list.Distinct().ToList();
// Удалить пробельные символы
list.RemoveAll(x => string.IsNullOrWhiteSpace(x));
// Взять первую строку
if (list.Count > 0)
{
proxy = list[0];
// Удалить первую строку
list.RemoveAt(0);
// Добавить взятую строку в конец файла.
list.Add(proxy);
}
// Записать изменения в файл
File.WriteAllLines(pathFile, list);
}
return proxy;
}
}
// Путь к файлу который нужно читать в список
string pathFile = @"C:\papka\proxy.txt";
// Переменная под прокси
string proxy = YourCode.GetProxy(pathFile);