C#字典中的动态SMTP实例和线程

C#字典中的动态SMTP实例和线程,c#,multithreading,dynamic,dictionary,smtp,C#,Multithreading,Dynamic,Dictionary,Smtp,我撞到另一面墙了。请回顾我之前关于多线程和SMTP的问题 无论如何,我试图在运行时动态创建线程并调用Start()方法,但收到一个KeyNotFoundException。对此有任何见解都将不胜感激。如果我的代码与此相去甚远,基本上我希望完成的是根据用户输入(计数)创建一个在单个线程上运行的唯一SMTP实例,并同时运行每个线程 //count is user input (number of messages) int instanceCount = 0; var var

我撞到另一面墙了。请回顾我之前关于多线程和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++;
        }

在委托内部存储循环变量时,需要在委托外部声明一个单独的变量,以避免接收迭代的最后一个值

如果您制作一个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);
                }
            }
        });

您需要先向词典中添加一条记录,不能直接用[“”]引用它
        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);
                }
            }
        });