2010-01-09 5 views
-1

В previous question Я спросил, как улучшить код. Было сказано, что я должен переместить его в новую нить. Я никогда не думал об этом раньше, так что это кажется отличной идеей для меня. Итак, этим утром я пошел вперед и повторно использовал немного кода, который у меня уже есть для обработки электронных писем, и обновил способ обработки изображений на моем сайте.Безопасный способ начать и использовать новую тему?

Так это хороший способ начать новую тему и обработать изображения? Есть ли необходимость заблокировать его, как я?

private static object dummy = new object(); 

public static void Save(int nProjId, byte[] bData) 
{ 
    var worker = new ThreadStart(() => ProcessImage(nProjId,bData)); 
    var thread = new Thread(worker); 
    thread.Start(); 
} 

private static void ProcessImage(int nProjId, byte[] bData) 
{ 
    lock (dummy) 
    { 
     try 
     { 
      byte[] xlargeImage = Thumbs.ResizeImageFile(bData, 700); 
      byte[] largeImage = Thumbs.ResizeImageFile(bData, 500); 
      //improved based on previous question to use the already reduced image 
      byte[] mediumImage = Thumbs.ResizeImageFile(xlargeImage, 200); 
      byte[] smallImage = Thumbs.ResizeImageFile(xlargeImage, 100); 

      //existing code to actually save the images 
      MyGlobals.GetDataAccessComponent().File_Save(
       ConfigurationManager.ConnectionStrings["ImgStore"], 
       nProjId, 
       xlargeImage, 
       largeImage, 
       mediumImage, 
       smallImage); 
     } 
     catch (Exception) 
     { 
      //ToDo: add error handleing 
      { } 
      throw; 
     } 
    } 
} 

О и изображения Теперь загружать и обрабатывать практически мгновенно (локально), так что это огромная помощь до сих пор. Я просто хочу убедиться, что это лучший способ сделать это. О, и я использую двухъядерную машину с сервером 2008 года с 6 ГБ или баром, поэтому у меня есть небольшое пространство для маневра, чтобы сделать его быстрее или использовать больше потоков.

ответ

2

Я бы предложил использовать класс ThreadPool, в частности потому, что он будет повторно использовать поток для вас, а не создавать новый поток каждый раз, что немного более интенсивно.

Ознакомьтесь с методом QueueUserWorkItem.

Также, если вы не используете статический ресурс для записи (я не уверен, что именно делает File_Save) Я не думаю, что вам нужна ваша блокировка. Однако, если вы используете статический ресурс, вы должны использовать lock только тот код, который его использует.

+0

Я не уверен, что 'File_Save' также использует статический ресурс. Я честно (читай ** ОЧЕНЬ **) зеленый при программировании. Но чтобы объяснить это, это вызов DAL для фактического сохранения файлов и некоторых других данных в БД. В какой-то момент я буду перемещать файловую память в файловую систему, но теперь ее проще просто оставить в БД. Но, глядя на него, он не указывает на статичность в DAL, поэтому я не думаю, что это так. –

0

Это для любого производственного кода? Или просто образец? Если это не производственный код, помимо использования ThreadPool, вы можете использовать TPL из .NET4.0. MS рекомендует использовать TPL вместо ThreadPool.

+0

Это для моего личного сайта, так что это «производство». Но я еще не готов к версии 4.0, я просто использую несколько элементов. –

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