在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;
}
}
}
哦,图像现在几乎立即(本地)上传和处理,所以到目前为止这是一个巨大的帮助。我只是想确保这是最好的方法。哦,我正在使用运行带有6gb或ram的Server 2008的双核机器,所以我有一点摆动空间让它更快或使用更多线程。
答案 0 :(得分:2)
我建议使用ThreadPool类,特别是因为它会为你重新使用一个线程,而不是每次都创建一个新线程,这会更加集中。
查看QueueUserWorkItem方法。
此外,如果您没有使用静态资源写入(我不确定File_Save
究竟是什么)我不认为您需要锁定。但是,如果您使用的是静态资源,那么您应lock
只使用正在使用它的代码。
答案 1 :(得分:0)
这适用于任何生产代码吗?或者只是样品?如果它不是生产代码,除了使用ThreadPool,您可以使用.NET4.0中的TPL。 MS建议使用TPL而不是ThreadPool。