C#锁定语句一次只允许一个线程访问对象。 在Parallel.ForEach循环中,在循环中创建新对象(局部变量)不是更快,而不是使用字段变量,因为这样就不会阻塞任何线程? 每种方式的优点/缺点是什么?线程锁定与创建新对象
我使用下面的代码,似乎创建一个本地变量,而不是在字段上使用锁定稍快。
nb。 toEmails变量中有3个电子邮件字符串。
//Method 1 with lock statement takes 14092ms
List<string> toEmails = getListOfToEmails();
Object locker = new object();
SmtpClient smtpClient = getSmtpObject();//smtpClient is used here as a field
Parallel.ForEach(toEmails, toEmail =>
{
string emailBody = getEmailBody(toEmail);
MailMessage mailMessage = getMailMesssageObject(emailBody, toEmail);
lock (locker)
{
smtpClient.Send(mailMessage);
}
});
//Method 2 without lock statement (creating a new local var each iteration) takes 13947ms
List<string> toEmails = getListOfToEmails();
Parallel.ForEach(toEmails, toEmail =>
{
SmtpClient smtpClient = getSmtpObject();//smtpClient is used here as a local var
string emailBody = getEmailBody(toEmail);
MailMessage mailMessage = getMailMesssageObject(emailBody, toEmail);
smtpClient.Send(mailMessage);
});
如果您的共享对象具有某种您关心的独特状态信息,那么您不能仅仅创建新的状态信息。 –
如果我记得正确TPL也支持其循环中的线程局部变量。 – Dirk
通常,通过创建一个线程池,可以在启动时创建一个“重”,然后在池队列中循环,为“重”创建数据,从而避免不断创建繁重的对象和线程。换句话说,我可能不会使用任何一种替代品。 –