Как сохранить файлы на жесткий диск в отдельном потоке?

У меня есть камера, и я считываю изображения в реальном времени в массив. Я применяю какой-то алгоритм к изображению и показываю его. Затем я получаю следующее изображение и тоже показываю его. Поэтому я транслирую изображения с камеры на дисплей. Однако я также хочу сохранять изображения на жесткий диск после их отображения. Я пробовал использовать основной поток, но все сильно замедлилось. Затем я попытался использовать ThreadPool (см. Код ниже). Это не замедляет отображение, но я обнаружил, что изображения не сохраняются должным образом. Похоже, что они расположены не в ожидаемом порядке, и после сохранения примерно 50 изображений данные последующих изображений выглядят искаженными. Я предполагаю, что запускается слишком много потоков.

Есть ли лучший способ сделать это? Я думаю, мне нужен только один поток для сохранения изображений. Может быть какая-то очередь, сохраняющая каждое изображение последовательно. Пока это делается в фоновом режиме и не замедляет отображение. Если бы кто-то мог опубликовать фрагмент кода, это было бы фантастически.

short[] image1 = new short[20000];
while(streaming)
{
    ReadImageFromCamera(ref image1)
    ImageData data;    

    data.fileName = imageNumber;
    data.image = image1;

    ThreadPool.QueueUserWorkItem(WriteImageToFile, data);  // Send the writes to the queue
}


private void WriteImageToFile(object imageData) {

    try {
        ImageData data = (ImageData)imageData;
        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

        string fName = myDirectory + @"/" + Convert.ToString(data.fileName) + @".spe";

        using (Stream myStream = new FileStream(fName, FileMode.Create)) {
            bf.Serialize(myStream, data.image);
        }
    }
    catch (Exception) { }
}
6
задан Brian Tompsett - 汤莱恩 19 December 2015 в 20:06
поделиться