Поток и объект по ссылке - PullRequest
1 голос
/ 08 марта 2012

Я хотел бы спросить, безопасен ли этот поток кода?Возникла проблема с 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();
    }
}

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Я не вижу проблемы с attachment. Правда, он захвачен в замыкании, но поскольку он объявлен внутри цикла, с этим не должно быть никаких проблем.

Однако есть проблема с message. Попробуйте var message1 = message;, а затем используйте message1 в лямбде.

1 голос
/ 08 марта 2012

Нет, это, вероятно, не будет работать - но это не только вложение (см. Ответ Даринса), но и объект 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);

Если вы действительно хотите, чтобы вы могли передать это в качестве параметра - точно так же, как Дарин сделал с его вариантом, но я не думаю, что это действительно необходимо)

...