2012-03-08 2 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

답변

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;을 시도한 다음 람다에 message1을 사용하십시오.