Здравствуйте,
Тут вот какая проблема. Есть консольное приложение для обработки данных.
Часть важных данных, порядок следования которых критичен, обрабатывается в отдельном потоке
через 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.
Есть какие-то мысли почему так происходит?