Есть две проблемы с вашим ErrorTask
. Во-первых, вы инициализируете новый экземпляр Random
каждый раз, когда вызывается метод. Конструктор Random
по умолчанию запускает генератор случайных чисел со значением Environment.TickCount
, которое, вероятно, будет одинаковым для последовательных потоков. Таким образом, вы получите одну и ту же случайную последовательность для нескольких потоков.
Тем не менее, большая проблема заключается в том, что generator.Next(1)
будет всегда возвращать 0. Random.Next(int max)
генерирует случайное число N, такое что 0 <= N < max
. Таким образом, ваш ErrorTask
сгенерирует исключение для каждого потока.
Я понятия не имею, как или почему было бы выбрасывать это исключение более одного раза за вызов ErrorTask
. Это кажется невозможным.
Я бы предложил следующую модификацию:
private Random generator = new Random();
void ErrorTask(object obj)
{
int value;
lock (generator)
{
value = generator.Next(2);
}
if (value == 0)
throw new Exception("Sample exception thrown");
else
System.Diagnostics.Trace.WriteLine("Processed thread");
}
generator
теперь имеет область видимости класса и инициализируется только один раз. lock
используется для предотвращения одновременной генерации номера несколькими потоками. Без блокировки генератор случайных чисел может быть поврежден, и он будет возвращать 0 при каждом вызове. И я изменил параметр на generator.Next
на 2, чтобы вы могли получить числа 0 и 1.