Многопоточная отправка данных на сервер
От: Nikola78  
Дата: 27.09.12 21:01
Оценка:
Есть 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, то тогда нельзя будет обратиться по индексу. И стоит ли вообще это пытаться обойти?


Правильная ли реализация для такой задачи?
Сколько все-таки должно быть потоков?
Как улучшить производительность?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.