安全的方式来启动和使用新的线程?

时间:2010-01-09 22:00:06

标签: c# multithreading

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的双核机器,所以我有一点摆动空间让它更快或使用更多线程。

2 个答案:

答案 0 :(得分:2)

我建议使用ThreadPool类,特别是因为它会为你重新使用一个线程,而不是每次都创建一个新线程,这会更加集中。

查看QueueUserWorkItem方法。

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

答案 1 :(得分:0)

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