имеется фрагмент кода
int readen = 1;
int i = 0;
while (readen > 0)
{
if (msList.Count >= 20)
{
Thread.Sleep(200);
continue;
}
else
{
msList.Add(new MemoryStream());
gzsList.Add(i, new GZipStream(msList.Last(), CompressionMode.Compress));
readen = fsIn.Read(buffer, 0, buffer.Length);
compressTasks.Add(new Task(() => { (gzsList[i] as GZipStream).Write(buffer, 0, readen); }));
i++;
compressTasks.Last().Start();
}
}
проблема в том что в строке compressTasks.Add(new Task(() => { (gzsList[i] as GZipStream).Write(buffer, 0, readen); }));происходят непонятные вещи: при выполнении условия не происходит засыпание треда, а выполнение переходит на эту строку и соответственно вываливается исключение, причем зависящий от типа коллекции gzslist(для List``System.InvalidOperationException, Dictionary KeyNotFoundException, Hashtable NullReferenceException. Если убрать условие, то все равно вываливаются исключения, но при разной величине коллекции(зависит от запуска(от 20 до 50)
Taskиспользуете как потоки? Почему не современный async/await? – VladD Mar 31 '16 at 22:11Task'а в коллекцию должно приводить к засыпанию потока. – VladD Mar 31 '16 at 22:13Task'ами переменнуюi, это бомба замедленного действия (подумайте, почему). – VladD Mar 31 '16 at 22:15iпо ссылке. Так что у вас разделяемая переменная с понятными последствиями. – VladD Apr 01 '16 at 16:41GZipStream– Artemiy Borodin Apr 02 '16 at 07:52