引用的线程和对象

本文关键字:对象 线程 引用 | 更新日期: 2023-09-27 18:27:03

我想问一下这个代码线程安全吗?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();
    }
}

引用的线程和对象

不,这可能不起作用-但这不仅是附件(请参阅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);

如果你真的想,你可以把它作为参数传递——就像Darin对它的变体所做的那样,但我认为这不是真正需要的)

我认为attachment没有问题。的确,它是在一个闭包中捕获的,但正如它在循环中声明的那样,这应该没有任何问题。

但是,message存在一个问题。请尝试var message1 = message;,然后在lambda中使用message1