Есть windows сервис. Используется для обновления списка своих товаров на торговой площадке: он следит за файлом с помощью FileSystemWatcher и как только тот пояляется, он его читает и отправляет запросы в API интерфейс на сервер.
Я сделал его многопоточным, установил кол-во потоков равным
15. Не знаю почему именно столько и не знаю, много ли это или мало. Однако он работает.
Вот метод отправки данных на сервер.
Идея такова:
— если записей в файле меньше, чем кол-во потоков, то проходится по каждой записи и создаем один поток и отправляем данные.
— если записей в файле больше, чем кол-во потовов, то отправляем данные порциями по 15 (кол-во потоков).
private void Request(IEnumerable<Info> items)
{
Info[] infoArray = items.ToArray();
Thread[] threads = new Thread[MaxCount];
bool isPartialSending = info.Length > MaxCount;
int deltaIndex = 0;
for (int i = 0; i < info.Length; i++)
{
if (isPartialSending)
{
if (i != 0 && i % MaxCount == 0)
{
Wait(threads);
deltaIndex = MaxCount * (i / MaxCount);
}
}
Info info = infoArray[i];
threads[i - deltaIndex] = new Thread(_ => info.ReviceItem(apiContext));
threads[i - deltaIndex].Start();
}
Wait(threads);
}
private static void Wait(IEnumerable<Thread> threads)
{
foreach (var thread in threads.Where(t => t != null))
{
thread.Join();
}
}
Как мне кажется, тут довольная низкая производительность: сначала он ест 2Кб. Если добавить файл в директорию, то он начинает есть 50Кб.
К тому же, файл с 20 записями весит около 0,5Кб. Если будет весить около 1Мб, то в нем будет много тысяч записей. Их все их нужно будет отправлять порциями по 15 шт.
К тому же, если кол-во записей в файле меньше чем 15 (MaxCount), то все равно я создаю 15 потоков. Я не придумал как это обойти: если использовать List, то тогда нельзя будет обратиться по индексу. И стоит ли вообще это пытаться обойти?
Правильная ли реализация для такой задачи?
Сколько все-таки должно быть потоков?
Как улучшить производительность?