2012-03-08 42 views
1

我想問一下這段代碼是否線程安全? attachment對象存在問題。它被引用傳遞給新線程,其中MailHelper使用它,有時attachment對象在線程之間混合。線程和對象引用

public static void Start() 
{ 
    foreach (var message in messages) 
    { 
     //skip code 
     var fileName = httpWebResponse.GetResponseHeader("filename"); 
     var fileStream = httpWebResponse.GetResponseStream(); 
     var attachment = new Attachment(fileStream, fileName); 

     var thread = new Thread(() => 
     { 
      var dictionary = new ListDictionary 
      { 
       { "$Url$", message.Url } 
      }; 

      MailHelper.SendMessage(dictionary, 
       message.Mail.Headers.From.Address, 
       "EmailConvertSuccess.txt", 
       attachment) 
     }); 

     thread.Start(); 
    } 
} 
+0

像評論說,消息對象是混合在線程之間。附件狀態是未知的,可能是奇怪的,但不是問題。 – CodingBarfield 2012-03-08 08:27:56

回答

1

沒有這將可能無法正常工作 - 但它不僅是附件(見Darins答案),但你作爲一個迭代器使用,以及在message對象 - 你將不得不調用之前將其複製到本地實例你的主題是這樣的:

var messageCopy = message; 
new Thread(a => 
     MailHelper.SendMessage(
      new ListDictionary { { "$Url$", messageCopy .Url } }, 
      messageCopy.Mail.Headers.From.Address, 
      "EmailConvertSuccess.txt", 
      a as MailAttachment) 
    ).Start(attachment); 

如果你真的想你可以把它傳遞作爲參數 - 就像達林用它做的變種,但我不認爲這是真正需要的)

1

我不請參閱attachment的問題。誠然,它是在閉包中捕獲的,但是因爲它是在循環內聲明的,所以不應該有任何問題。

但是,message存在問題。嘗試使用var message1 = message;,然後在lambda中使用message1