У вас, похоже, нет кода обработки ошибок или регистрации, поэтому, если возникнет исключение, ваша программа остановится и у вас может не появиться запись о том, что произошло.Это особенно верно, поскольку ваша программа обрабатывает изображения асинхронно, поэтому основной поток, возможно, уже завершился к тому времени, когда в одном из ваших потоков обработки произошла ошибка.
Итак, прежде всего, я бы предложил броситьtry/catch
блокирует весь код, который запускается в отдельном потоке.Если возникнет исключение, вы захотите его перехватить и либо запустите ImageCheckCompleted
с некоторыми специальными аргументами события, чтобы указать, что произошла ошибка, либо запустите другое событие, которое вы создали специально для возникновения ошибки.Таким образом, ваша программа может продолжать обрабатывать, даже если в вашем коде возникнет исключение.
try
{
//... Do your processing
// This will happen if everything worked correctly.
InvokeImageCheckCompleted(new ImageCheckCompletedEventArgs();
}
catch (Exception e)
{
// This will happen if an exception got thrown.
InvokeImageCheckCompleted(new ImageCheckCompletedEventArgs(e);
}
Для простоты я бы предложил использовать цикл for
для обработки каждого изображения.Вы можете использовать ManualResetEvent
для блокировки выполнения до тех пор, пока не сработает событие ImageCheckCompleted
для каждой проверки.Это должно упростить ведение журнала выполнения каждого цикла, выявить ошибки, которые могут препятствовать запуску события ImageCheckCompleted
, и даже, возможно, перейти к обработке следующего изображения, если один из них, кажется, занимает слишком много времени.
Наконец, если вы можете сделать обработку изображений поточно-ориентированной, вы можете рассмотреть возможность использования Parallel.ForEach
, чтобы сделать так, чтобы несколько изображений могли обрабатываться одновременно.Это, вероятно, значительно улучшит общую скорость обработки пакета.