При работе с потоками порядок больше не находится под вашим контролем. Пул потоков может планировать потоки в любом порядке. Если вам нужно, чтобы все происходило последовательно в определенном порядке, многопоточность не имеет особого смысла.
Что касается поврежденных изображений, похоже, что экземпляр short[] image1
передается. Неясно, что происходит внутри ReadImageFromCamera
, но, поскольку вы передаете в него предварительно инициализированный массив, есть вероятность, что метод будет использовать этот массив и просто скопировать в него данные (хотя ключевое слово ref
указывает, что оно может создать новый экземпляр массива и назначьте его вместо этого). Затем вы передаете этот экземпляр массива WriteImageToFile
в отдельном потоке.
Тем временем параллельно вы получаете следующее изображение. Теперь у вас есть сценарий, в котором ReadImageFromCamera
может записывать данные в массив в то же время, когда WriteImageToFile
хранит данные на диске. Там у вас есть испорченное изображение. Этого можно избежать, передав новый экземпляр массива в WriteImageToFile
:
ReadImageFromCamera(ref image1)
ImageData data;
data.fileName = imageNumber;
data.image = (short[])image1.Clone(); // create a new array instance, so that
// the next call to ReadImageFromCamera
// will not corrupt the data
ThreadPool.QueueUserWorkItem(WriteImageToFile, data);
Тем не менее, , как уже упоминал Аль Кепп , поскольку у вас только один жесткий диск, запуск нескольких потоков может оказаться не лучшим вариантом для вас. Можно было бы создать один длительный отдельный поток для хранения данных на диске и поместить образы в какую-то очередь, в которую поток хранения собирает данные и записывает их на диск. Это связано с собственным набором проблем, связанных с параллелизмом, ограничением размера очереди, а что нет.