引用的线程和对象
本文关键字:对象 线程 引用 | 更新日期: 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
。