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)
    {
        // обработка
    }
}