Моя программа выполняет задачи в группах из n
задач одновременно.Каждая задача записывает данные в собственный объект Queue<string>
, предоставленный индексом в Queue<string>
в List<Queue<string>>
очередях.задачи не разделяют данные или очереди, но я все еще получаю ошибки синхронизации.Я знаю, что структуры данных не являются потокобезопасными, я не понимаю, почему они должны быть и почему я получаю ошибки, поскольку каждый Task
имеет свою собственную структуру данных, что может вызвать ошибки?
Вот простой код для демонстрации:
class Program
{
static int j = 0;
List<Queue<string>> queueList = new List<Queue<string>>();
public void StartTasts(int n)
{
for (int i = 0; i < n; i++)
queueList.Add(new Queue<string>());
List<Task> tsk = new List<Task>();
for (int TaskGroup = 0; TaskGroup < 10; TaskGroup++)
{ //10 groups of task
//each group has 'n' tasks working in parallel
for (int i = 0; i < n; i++)
{
//each task gets its own and independent queue from the list
tsk.Add(Task.Factory.StartNew(() =>
{
DoWork(j % n);
}));
j++;
}
//waiting for each task group to finish
foreach (Task t in tsk)
t.Wait();
//after they all finished working with the queues, clear queues
//making them ready for the nest task group
foreach (Queue<string> q in queueList)
q.Clear();
}
}
public void DoWork(int queue)
{
//demonstration of generating strings
//and put them in the correct queue
for (int k = 0; k < 10000; k++)
queueList[queue].Enqueue(k + "");
}
static void Main(string[] args)
{
new Program().StartTasts(10);
}
}
эта программа генерирует некоторые ошибки, такие как:
System.ArgumentException: 'Массив назначения был недостаточно длинным.Проверьте destIndex и длину, а также нижние границы массива. '
System.IndexOutOfRangeException:' Индекс находился за пределами массива. '(в очереди)
System.AggregateException: произошла одна или несколько ошибок.---> System.ArgumentException: исходный массив был недостаточно длинным.Проверьте srcIndex и длину, а также нижние границы массива.
и другие ошибки и не будут возникать в случае с последовательным интерфейсом.Мне бы очень хотелось понять, почему, потому что я не вижу, как эти задачи портят независимые очереди друг друга.