2013-09-17 2 views
4

Мой текущий код является:C# Как использовать MemoryStream с многопоточной

public static byte[] ImageToByte(Image img) 
{ 

     byte[] byteArray = new byte[0]; 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      img.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); 
      stream.Close(); 
      byteArray = stream.ToArray(); 
     } 


     return byteArray; 
} 

Есть ли способ, чтобы сделать эту работу с многопоточностью, или использовать все ядра моего процессора сделать это быстрее?

+8

Попытка сохранить единый поток с многопоточной напрашивается на неприятности, я сомневаюсь, что это узкое место – Sayse

ответ

5

Если вы конвертируете несколько изображений в массив байтов и знаете их заранее, вы можете использовать цикл Parallel.ForEach и сделать это там, чтобы они могли выполняться в разных ядрах, если они доступны. Но я не думаю, что изменение этого единственного метода для использования нескольких ядер стоит усилий и экономит любое время.

1

Это невозможно сделать многопоточным. Это может привести к повреждению потока. Изображение должно быть сохранено в потоке со смещением нуля. Если какие-либо дополнительные данные были записаны в поток перед сохранением изображения, данные изображения в потоке будут повреждены.

MSDN

+0

любая ссылка, потому что это проект спасибо –

-1

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

private static readonly Object _obj = new Object(); 

Затем измените код, как показано ниже:

public static byte[] ImageToByte(Image img) 
{ 
    lock(_obj) 
    { 
     byte[] byteArray = new byte[0]; 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      img.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); 
      stream.Close(); 
      byteArray = stream.ToArray(); 
     } 

     return byteArray; 
    } 
} 
+1

Если вы не используете Mac, я сомневаюсь, что время, которое потребуется, чтобы сохранить изображение, должно гарантировать это. – Sayse

+0

Статические методы внутри многопоточного всегда должны быть синхронизированы. Кроме того, существует общее ошибочное восприятие стоимости блокировки объекта. Это не так уж важно и хорошо стоит защита от коррупции. – edepperson

+0

@edepperson «Статические методы внутри многопоточного всегда должны быть синхронизированы» не соответствует действительности. – Jacob

Смежные вопросы