2010-01-09 64 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; 
     } 
    } 
} 

哦,图像现在几乎立即(本地)上传和处理,所以这是一个巨大的帮助。我只是想确保这是做到这一点的最佳方式。哦,我正在使用运行Server 2008的双核心机器,使用6gb或ram,所以我有一个小小的摆动空间来使它更快或者使用更多的线程。

回答

2

我建议使用ThreadPool类,因为它会为您重新使用一个线程,而不是每次创建一个新的线程,这是一个更密集的一点。

检查出QueueUserWorkItem方法。

另外,如果你没有使用静态资源写入(我不确定File_Save究竟是什么)我不认为你需要锁定。但是,如果您使用的是静态资源,那么您应该只使用它的代码即lock

+0

我不太确定'File_Save'是否也使用静态资源。我在编程时相当(阅读**非常**)绿色。但要解释它,这是一个调用DAL实际上将文件和一些其他数据保存到数据库。我会在某个时候将文件存储移动到文件系统,但现在只是留在数据库中。但在看它时,它并不表示DAL中的静态,所以我不认为它是。 – 2010-01-09 22:28:51

0

这是用于任何产品代码?或者只是一个样本?如果不是生产代码,除了使用ThreadPool之外,您可以使用.NET4.0中的TPL。 MS建议使用TPL而不是ThreadPool。

+0

这是我的个人网站,所以它是“生产”。但我还没有准备好4.0,但我正在使用一些3.5项目。 – 2010-01-10 01:13:10