2013-08-29 66 views
0

從新線程中聲明的局部變量的用法有任何區別嗎?線程中的外部變量用法

string emailSubject = "New message notification"; 
string imagePath = somePath; 
string conversationName = entity.Name; 

new Thread(delegate() 
{ 
    foreach (var user in participantList) 
    { 
     string newEmailBody = emailBody.Replace("###ImagePath###", imagePath) 
              .Replace("###UserName###", user.Name) 
              .Replace("###ConversationName###", conversationName); 

     MailUtil.SendEmail(user.Email, emailSubject, newEmailBody); 
    } 
}).Start(); 

在新線程中聲明它們更安全嗎?就像這樣:

new Thread(delegate() 
{ 
    string emailSubject = "New message notification"; 
    string imagePath = somePath; 
    string conversationName = entity.Name; 

    foreach (var user in participantList) 
    { 
     string newEmailBody = emailBody.Replace("###ImagePath###", imagePath) 
              .Replace("###UserName###", user.Name) 
              .Replace("###ConversationName###", conversationName); 

     MailUtil.SendEmail(user.Email, emailSubject, newEmailBody); 
    } 
}).Start(); 

回答

1

由於所有在你的榜樣三個貴變量是不可變的(string is immutable)則沒有差別,選擇哪一個實現。唯一的區別是在第一個例子中你的變量(指針)可以在其他情況下從其他線程改變,這是安全的。但是當你使用複雜類型時,你必須確保你的類型是thread-safe,因爲以其他方式對不同線程中的變量進行同時操作可能會導致損壞狀態。

+0

垃圾回收器呢?對於第一個變體,GC會「知道」這些變量仍在使用中嗎? – Pal

+0

@Pal是的。 GC足夠聰明,可以跟蹤這些變量。在第一種情況下,應用所謂的「封閉」程序。一般來說,你不應該對GC感到擔心,但瞭解GC的算法可以幫助你更好地設計你的應用程序。 –