字典中的 C# 动态 SMTP 实例和线程
本文关键字:实例 线程 SMTP 动态 字典 | 更新日期: 2023-09-27 17:56:00
我撞到了另一堵墙。请在此处查看我之前关于多线程和SMTP的问题
无论如何,我正在尝试在运行时动态创建线程并调用 Start() 方法,但收到 KeyNotFoundException。对此的任何见解将不胜感激。如果我的代码离这里很远,基本上我希望完成的是创建一个根据用户输入(计数)在单个线程上运行的唯一SMTP实例,并同时运行每个线程。
//count is user input (number of messages)
int instanceCount = 0;
var vartable = new Dictionary<string, SmtpClient>();
var vartable2 = new Dictionary<string, Thread>();
for (int i = 0; i < count; ++i)
{
vartable[instanceCount.ToString()] = new SmtpClient
{
Host = txtBxSenderHost.Text,
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(strSenderAddress, strSenderPassword)
};
vartable2[instanceCount.ToString()] = new Thread(delegate()
{
using (var message = new MailMessage(senderAdrress, toAddress)
{
Subject = strSubject,
Body = strBody
})
{
{
((SmtpClient)vartable[instanceCount.ToString()]).Send(message);
}
}
});
instanceCount++;
}
只是为了测试,我使用"0"来查看是否有效
vartable2["0"].Start();
在委托中存储循环变量时,需要在委托外部声明一个单独的变量,以避免收到迭代的最后一个值。
如果创建 print 语句,您将看到每个线程尝试访问的值将是相同的,无论 count 的值是多少。只需在委托语句上方添加一个变量:
int tempInstanceCount = instanceCount;
vartable2[instanceCount.ToString()] = new Thread(delegate()
{
using (var message = new MailMessage(senderAdrress, toAddress)
{
Subject = strSubject,
Body = strBody
})
{
{
((SmtpClient)vartable[tempInstanceCount.ToString()]).Send(message);
}
}
});