Странности foreach при параллельной работе
От: abb269  
Дата: 30.04.16 14:11
Оценка:
Здравствуйте,
Тут вот какая проблема. Есть консольное приложение для обработки данных.
Часть важных данных, порядок следования которых критичен, обрабатывается в отдельном потоке
через LimitedConcurrencyLevelTaskScheduler (ссылка https://msdn.microsoft.com/en-us/library/ee789351%28v=vs.100%29.aspx)

        private static readonly TaskScheduler key1ts = 
            new LimitedConcurrencyLevelTaskScheduler(1);

        private static void NewData(string data)
        {
            Data d = new Data();
            d.line = data;
            
            if (data.StartsWith("key1"))
            {
                Task.Factory.StartNew(
                    GetKey1Handler,
                    d,
                    CancellationToken.None,
                    TaskCreationOptions.None,
                    key1ts);
                return;
            }
    }


С другой стороны есть несколько алгоритмов обработки этих данных (экземпляров класса Algo)
Управление в эти алгоритмы передается так

        private static void GetKey1Handler(object o)
        {
            Data d = (Data)o;

            tD.par1 = d.line;
            tD.par2 = d.line;
            
            int ii = 0;
            
            for (int i = 0; i < 10; i++)
            {
                ii++;
                foreach (Algo a in aList)
                {
                    a.GetHandler();
                }
                sw.WriteLine(ii);
                sw.Flush();
            }
        }


Очень странно, но при некоторых неблагоприятных условиях (долгая обработка в a.GetHandler) в файл sw попадют не все значения ii.
Я это понимаю так, что новая порция данных сбивает обработку, а сама куда-то исчезает.
Все мои попытки воспроизвести ситуацию на упрощенном примере ни к чему не приводят: в файле sw последовательное перечисление индекса.
Но боевой вариант точно где-то сбоит: в логе обрыв на полуслове обработки в отдельном хэндлере, а в файле не все значения ii.
Есть какие-то мысли почему так происходит?
Отредактировано 30.04.2016 14:21 abb269 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.