IZennoList — потокобезопасность и файлы
Bind — привязка к файлу
После Bind все операции со списком читают и пишут в файл.
Для файловых списков lock обязателен.
IZennoList list = project.Lists["FileList"];
list.Bind(project.Directory + "\\data.txt");
lock (list)
{
list.Add("новая строка");
}Правило lock
// Обычный список — lock не нужен
list.Add("элемент");
// Файловый список — lock обязателен
lock (fileList)
{
fileList.Add("элемент");
string item = fileList[0];
fileList.RemoveAt(0);
}Долгие операции держи вне блокировки:
// Готовим данные до lock
string data = ProcessData();
lock (fileList)
{
fileList.Add(data); // быстро
}Очередь задач
IZennoList tasks = project.Lists["Tasks"];
tasks.Add("новая_задача");
if (tasks.Count > 0)
{
string next = tasks[0];
tasks.RemoveAt(0);
project.SendInfoToLog("Выполняю: " + next);
}Пул прокси (файловый список)
IZennoList proxies = project.Lists["Proxies"];
proxies.Bind(project.Directory + "\\proxies.txt");
string proxy = "";
lock (proxies)
{
if (proxies.Count > 0)
{
proxy = proxies[0];
proxies.RemoveAt(0);
}
}
// ... работа с прокси ...
// Вернуть прокси обратно
lock (proxies)
{
proxies.Add(proxy);
}Накопление и сброс батча
IZennoList results = project.Lists["Results"];
results.Add("обработанные_данные");
if (results.Count >= 100)
{
string[] batch = new string[results.Count];
results.CopyTo(batch, 0);
results.Clear();
foreach (string item in batch)
{
// обработка
}
}